swingworkers的背景任务变得顺序

时间:2010-09-06 16:37:20

标签: java multithreading concurrency swingworker

我正在使用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 ] DEBUG - &gt;第一次远程方法调用

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

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

为什么会这样?我认为这是随机交错,但我注意到2个实例具有相同的名称?摇摆工人是否合并?这是随机行为吗?不是我看到2个并发呼叫?如果它们被重用,那么我可以做些什么来同时进行并发呼叫,而不是平行主义吗?

由于

2 个答案:

答案 0 :(得分:7)

问题是,所有Swingworkers都在相同的Background-Thread上运行。当您希望它们运行并发时,您可以将它们添加到这样的Executor服务中,例如:

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

来源:Oracle Forums

答案 1 :(得分:4)

您可以查看此post

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