0

私は actionListener を使用して一連のイベントをトリガーしていますが、最後にこのコードが呼び出されます。

public class ScriptManager {

public static Class currentScript;
private Object ScriptInstance;
public int State = 0;
// 0 = Not Running
// 1 = Running
// 2 = Paused

private Thread thread = new Thread() {
    public void run() {
        try {
            currentScript.getMethod("run").invoke(ScriptInstance);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
};

public void runScript() {
    try {
        ScriptInstance = currentScript.newInstance();
        new Thread(thread).start();
        State = 1;
        MainFrame.onPause();
    } catch (Exception e) {
        e.printStackTrace();
    }
}   

public void pauseScript() {
    try {
        thread.wait();
        System.out.println("paused");
        State = 2;
        MainFrame.onPause();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void resumeScript() {
    try {
        thread.notify();
        System.out.println("resumed");
        State = 1;
        MainFrame.onResume();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void stopScript() {
    try {
        thread.interrupt();
        thread.join();
        System.out.println("stopped");
        State = 0;
        MainFrame.onStop();
    } catch (Exception e) {
        e.printStackTrace();
    }
 }
}

ランナブルが作成されて実行されますが、他の方法を使用しようとすると問題が発生し、UI がロックされます。(これは EDT でこれを実行しているためだと思います) これを修正する方法を知っている人はいますか?

4

1 に答える 1

1

それはあなたが使用する方法ではありませんwaitand notify。一時停止して再開しようとしているスレッドで実行する必要があります。つまり、何らかの方法で他のスレッドにメッセージを送信する必要があります。これを行うにはさまざまな方法がありますが、他のスレッドがこのメッセージをリッスンするか、少なくとも時折チェックする必要があります。

于 2013-11-09T20:51:00.460 に答える