4

我正在使用 SwingWorkers 使我的 GUI 响应。但我无法理解以下内容:当用户按下按钮时,我想从 GUI 调用一个远程方法。我在按钮的操作内(简写问题):

//in action of button
SwingWorker worker = new SwingWorker<boolean,Void>(){
   @Override
   public boolean doInBackground(){
      return call_remote_method_here();
   }

};
worker.execute();
//some other code

我的问题是,虽然 gui 似乎反应灵敏,但对远程方法的实际调用是顺序的,而不是并发的。我在网络跟踪中注意到它,并认为该方法正在阻塞。但后来我在跟踪中看到 SwingWorkers 似乎是按顺序运行的。从

日志 2010-09-06 16:58:22,962 [ SwingWorker-pool-4-thread-1 ] 调试 -->第一个远程方法调用

我得到响应,然后第二个 swingworker 运行

2010-09-06 16:58:23,227 [ SwingWorker-pool-4-thread-1 ] 调试 --> 第二个远程方法调用

为什么会这样?我认为这是随机交错,但我注意到这两个实例具有相同的名称?摇摆工人是否集中在一起?这是随机行为吗?我不应该看到 2 个并发呼叫吗?如果它们被重用,我能做些什么来进行并发调用而不是并行?

谢谢

4

2 回答 2

7

问题是,所有 Swingworkers 都在同一个 Background-Thread 上运行。当您希望它们同时运行时,您可以将它们添加到 Executor Service 中,例如:

Executor executor = Executors.newCachedThreadPool();
executor.execute(yourSwingWorker);

资料来源:甲骨文论坛

于 2010-09-06T16:52:54.377 回答
4

你或许可以看看这篇文章

给定的解决方案之一是使用您自己的执行程序服务执行 SwingWorker 实例。jdk 1.6 update 18 中的更改似乎改变了默认行为。

于 2010-09-06T16:50:41.183 回答