0

javax.script を使用してスクリプトを実行する Java Swing アプリケーションがあります。スクリプトは、swing ウィジェットにアクセスし、 などのユーザー アクションをシミュレートしますJButton.doClick()。一部のウィジェット アクションによって 1 つ以上のアクションが開始され、すべてのアクションが完了Threads (SwingWorker)するまでスクリプトを待機させる必要があります。Threadsしかし、スクリプトはイベント ディスパッチ スレッドで実行されるため、たとえば、 aCountDownLatchawait()に a FutureTask、次にsubmit()andget()を実行するget()と、 EDT が停止し、GUI がハングします。EDT を停止せずにスクリプトを待機させる方法はありません。この問題の回避策はありますか?

ありがとう

4

2 に答える 2

3

最近のプロジェクトの1つで、これと同様の問題に直面しました。私がそれを回避する方法は、EDTに新しいスレッドを作成(および実行)させanonymous SwingWorker、それが私のスレッドを呼び出し(そして待機)することでした。

public void methodCalledByEDT() {
    new SwingWorker<Void, Void>() {
        public Void doInBackground() {
            // Execute threads and wait for them here
            // using the method you described above
            return Void;
        }

        public Void done() {
            // Code to execute when threads have finished goes here
            return Void;
        }
    }.execute()
}

これにより、EDTが自由にビジネスを継続できるようになります。スレッドが終了するのを待ってブロックされるのは匿名のSwingWorkerです。

于 2012-05-17T01:21:36.387 に答える
0

java.lang.ThreadGroupThreadGroupパラメーターとしてを使用してスレッドを作成します。次に、を使用ThreadGroup#activeCount()して、そのグループで稼働しているスレッドの数を見積もることができます。スレッドがすべて終了するのを待つには、グループのアクティブなスレッド数が0になるまで待機するwhileループを使用できます。この時点で、コードを実行します。

于 2012-05-17T01:15:34.343 に答える