0

我有一个使用 javax.script 运行脚本的 java swing 应用程序。脚本访问 swing 小部件并模拟用户操作,例如JButton.doClick(). 一些小部件操作会导致一个或多个Threads (SwingWorker)启动,我需要脚本等到所有操作Threads都完成。但是脚本在事件调度线程中运行,所以如果我这样做,例如,aCountDownLatch里面 await()有 a FutureTask,然后submit()and get()get()将停止 EDT,并且 GUI 挂起。如果不停止 EDT,就无法让脚本等待。这个问题的任何解决方法?

谢谢

4

2 回答 2

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 被阻塞等待线程完成。

于 2012-05-17T01:21:36.387 回答
0

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

于 2012-05-17T01:15:34.343 回答