我正在创建一个阅读器应用程序。读者根据参数识别要读取的文件,进行一些处理并将结果返回给调用者。
我正在尝试使这个多线程,以便可以处理多个请求。我认为它很简单但后来意识到它有一些复杂性。即使我使用执行程序服务创建线程,我仍然需要将结果返回给调用者。所以这意味着等待线程执行。
我能想到的唯一方法是写入一些常用位置或数据库,然后让调用者从那里选择结果。有什么方法可以吗?
答案 0 :(得分:3)
也许ExecutorCompletionService可以帮助您。完成后,提交的任务将放在队列中。您可以使用方法take或poll,具体取决于您是否要等待任务在完成队列中可用。
答案 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实现实际上不允许它。)