Java:创建多线程读取器

Java:创建多线程读取器,java,concurrency,Java,Concurrency,我正在创建一个阅读器应用程序。读取器根据参数识别要读取的文件,进行一些处理并将结果返回给调用者 我正在尝试将此多线程化,以便可以处理多个请求。我认为它很简单,但后来意识到它有一些复杂性。即使我使用executor服务创建线程,我仍然需要将结果返回给调用者。这意味着等待线程执行 我能想到的唯一方法是写入某个公共位置或db,并让调用者从中选择结果。有什么可能的方法吗?也许ExecutorCompletionService可以帮助您。提交的任务在完成时放置在队列中。您可以使用take或poll方法,具

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

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


我能想到的唯一方法是写入某个公共位置或db,并让调用者从中选择结果。有什么可能的方法吗?

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


使用一个线程池大小大于1的
ExecutorService
,发布自定义
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.
    }
  }
}
公共类MyTask扩展了FutureTask{
私人终审法院;
公共MyTask(MyUI ToUpdateWhenOne,可调用taskToRun){
超级(taskToRun);;
ui=toUpdateWhenDone;
}
@凌驾
受保护的void done(){
试一试{
//检索计算结果
最终MyModel computed=get();
//使用新模型触发UI更新
invokeLater(new Runnable()){
@凌驾
公开募捐{
setModel(计算);//设置新的ui模型
}
});
}
捕获(中断异常已取消){
//任务已取消…请在此处处理此案例
}
捕获(TimeoutException超时){
//任务超时(如果存在任何此类约束)。
//如果任务必须完成的时间没有限制,则不会发生
}
捕获(ExecutionException错误){
//处理计算MyModel对象期间引发的异常。。。
//如果在任务构造过程中传递的callable抛出
//调用其call()方法时发生异常。
}
}
}

编辑:对于需要发出状态更新信号的更复杂的任务,最好以这种方式创建自定义SwingWorker派生,并将其发布到ExecutorService上。(暂时不要尝试同时运行多个SwingWorker,因为当前的SwingWorker实现实际上不允许它。)

提交到executor服务时,您将获得一个未来,为什么不等待它的完成呢?谢谢Thomas,但这意味着进程需要等待将来的结果,因此必须对来自进程的请求执行多线程处理。你从哪里弄来的?RPC/RMI/Sockets?如果您能展示一些代码,那就太好了;)“调用者”和工作线程之间的预期交互是什么?您似乎表示调用方是异步的,即它提交请求并稍后轮询结果?调用将跨套接字进行。还没有写代码。仍在设计过程中:)