내 회사의 앱에 대한 설명은 다음과 같습니다. 법적 사유로 인해 일부 유사 코드이지만, 화면이 응답하지 않으면 GUI가 재부팅됩니다. SwingUtilities를 사용하여 EDT를 시작할 때마다 동일한 init 블록에서 두 개의 감시자 스레드를 만듭니다. 한 스레드는 Swing 유틸리티를 사용하여 EDT 스레드에서 작업을 수행합니다. 또 다른 스레드는 첫 번째 스레드가 반응하는지 확인하기 위해 첫 번째 스레드를 모니터링합니다. 첫 번째 스레드는 매우 간단한 명령을 수행 할 수있는 경우에만 응답을 인식합니다. true로
세트 isEDTCheck가, 그렇지 않으면 당신은 지속적으로 재부팅거야 (디버그 모드에서 정상적인 방식으로 거짓 실행할 때.
if (isEDTCheck) {
new Thread("EDTHeartbeat") {
@Override
public void run() {
Runnable thisThingYouDo = new Runnable() {
public void run() {
int x = 0;
}
};
while (true) {
// first thread says we are waiting, aka bad state
edtwait=true;
try {
javax.swing.SwingUtilities.invokeAndWait(thisThingYouDo);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// first thread says we are not waiting, good state
edtwait=false;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
new Thread("EDTValidator") {
@Override
public void run() {
while (true) {
// is first thread in bad state?
if (edtwait) {
try {
Thread.sleep(3000);
// after 3 seconds are we still in bad state? if so, get rid of initial frame, pop up a dialog box in AWT that does no commands
if (edtwait) {
mainFrame.setVisible(false);
new Dialog();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}
public class Dialog extends Frame {
private static final int WIDTH = 400;
private static final int HEIGHT = 300;
Frame f = null;
public Dialog() {
f = this;
hasSomethingBeenEntered=false;
this.setTitle("APP PROBLEM DETECTED");
this.setSize(WIDTH, HEIGHT);
this.setLocation((int)Toolkit.getDefaultToolkit().getScreenSize().getWidth() - myapp.width, 0);
Panel p1 = new Panel() {
@Override
public void paint(final Graphics g) {
int left = Dialog.WIDTH/2 - 45; // don't use WIDTH shadowed by Panel class
int top = Dialog.HEIGHT/2 - 20; // same as above
g.drawString("APP HAS DETECTED A PROBLEM", left, top);
}
};
this.add("Center", p1);
this.setAlwaysOnTop(true);
TextArea tb = new TextArea("APP HAS DETECTED A MAJOR PROBLEM\nIT WILL NOW RESTART IN 5 SECONDS");
this.add(tb);
this.setVisible(true);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
restartApp();
}
private void restartApp() {
Runtime.getRuntime().exec("cmd /c start cmd.exe /K \"cd C:\\Progra~1\\Common~1 && C:\\Progra~1\\Common~1\\MyAppDir\\myjavaapp.jar\"");
System.exit(0);
}
그래서 확장하는 클래스에서 플롯() 코드 실행을 만들고 싶어 할 SwingWorker를 실행하고 doInBackground() 함수에서 계산량이 많은 코드를 실행 한 다음 done() 함수를 사용하여 디스플레이를 새로 고칩니다. 계산이 진행되는 동안 내 GUI가 계속 활성화됩니까? – smuggledPancakes
@ user464095 : 가능합니다. – ColinD
빙고. 이것이 바로 SwingWorker가하는 일입니다. –