Java:创建一个多线程阅读器

时间:2011-09-30 11:00:17

标签: java concurrency

我正在创建一个阅读器应用程序。读者根据参数识别要读取的文件,进行一些处理并将结果返回给调用者。

我正在尝试使这个多线程,以便可以处理多个请求。我认为它很简单但后来意识到它有一些复杂性。即使我使用执行程序服务创建线程,我仍然需要将结果返回给调用者。所以这意味着等待线程执行。

我能想到的唯一方法是写入一些常用位置或数据库,然后让调用者从那里选择结果。有什么方法可以吗?

2 个答案:

答案 0 :(得分:3)

也许ExecutorCompletionService可以帮助您。完成后,提交的任务将放在队列中。您可以使用方法take或poll,具体取决于您是否要等待任务在完成队列中可用。

ExecutorCompletionService javadoc

答案 1 :(得分:1)

使用带有大小>的线程池的ExecutorService; 1,发布自定义FutureTask衍生产品,覆盖done()方法,向UI发出完成任务的信号:

public class MyTask extends FutureTask<MyModel> {
  private final MyUI ui;

  public MyTask(MyUI toUpdateWhenDone, Callable<MyModel> taskToRun) {
    super(taskToRun);
    ui=toUpdateWhenDone;
  }
  @Override
  protected void done() {
    try {
      // retrieve computed result
      final MyModel computed=get();
      // trigger an UI update with the new model
      java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
           ui.setModel(computed); // set the new UI model
        }
      });
    }
    catch(InterruptedException canceled) {
       // task was canceled ... handle this case here
    }
    catch(TimeoutException timeout) {
      // task timed out (if there are any such constraints). 
      // will not happen if there are no constraints on when the task must complete
    }
    catch(ExecutionException error) { 
      // handle exceptions thrown during computation of the MyModel object...
      // happens if the callable passed during construction of the task throws an 
      // exception when it's call() method is invoked.
    }
  }
}

编辑:对于需要发出状态更新信号的更复杂的任务,以这种方式创建自定义SwingWorker衍生产品并在ExecutorService上发布那些可能是个好主意。 (您应该暂时不尝试同时运行多个SwingWorkers,因为当前的SwingWorker实现实际上不允许它。)