在java swing中运行的脚本需要等待线程完成

时间:2012-05-16 22:49:51

标签: java multithreading swing

我有一个使用javax.script运行脚本的java swing应用程序。该 脚本访问swing小部件并模拟用户操作,例如JButton.doClick()。 某些窗口小部件操作会导致一个或多个Threads (SwingWorker)启动,并且 我需要脚本等待所有Threads完成。但脚本运行 在事件调度线程中,如果我这样做,例如,CountDownLatch有一个 在await()FutureTasksubmit()get()get()将停止 EDT和GUI挂起。没有停止EDT就无法让脚本等待。 这个问题的解决方法是什么?

由于

2 个答案:

答案 0 :(得分:3)

在我最近的一个项目中,我遇到了类似的问题。我解决它的方法是让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被阻塞等待线程完成。

答案 1 :(得分:0)

使用java.lang.ThreadGroup构造线程作为其ThreadGroup参数。然后,您可以使用ThreadGroup#activeCount()来估计该组中有多少个线程。要等待线程全部完成,您可以使用while循环等待,直到该组的活动线程数为0,此时您执行代码。