【问题标题】:Should I use ExecutorService?我应该使用 ExecutorService 吗?
【发布时间】:2012-06-07 06:38:00
【问题描述】:
在我的应用程序中,我正在执行一堆 SQL 查询,如作业和执行的详细信息,它们被插入到表中。插入任何记录后,侦听器应立即将其拾取并开始监视执行状态并更新同一张表中的状态。
我的前端已经准备就绪,直到现在我能够执行作业(多个查询)并将详细信息插入表中。现在我想捕获执行状态,并且我应该能够结束、暂停、重新启动执行。
当我经历多线程部分时,我遇到了 ExecutorService。
我的问题是我应该使用 ExecutorService 执行此操作吗?还是有其他方法?
请分享任何教程链接。
【问题讨论】:
标签:
java
multithreading
concurrency
parallel-processing
executorservice
【解决方案2】:
我使用 ExecutorService 来运行并行单元测试。并发现它非常成功。所以我建议你使用它。参考this
【解决方案4】:
是的。您可以通过ExecuteService、Callable 和Future 来实现此目的。
示例代码:
import java.util.concurrent.*;
import java.util.*;
import java.util.Random;
public class CallableDemo{
public CallableDemo(){
System.out.println("creating service");
ExecutorService service = Executors.newFixedThreadPool(10);
System.out.println("Start");
List<MyCallable> futureList = new ArrayList<MyCallable>();
for ( int i=0; i<10; i++){
MyCallable myCallable = new MyCallable();
Future future = service.submit(myCallable);
try{
System.out.println("future.isDone = " + future.isDone());
/* You can use future.get() blocking call set time out*/
System.out.println("future: call ="+future.get());
}
catch (CancellationException ce) {
ce.printStackTrace();
} catch (ExecutionException ee) {
ee.printStackTrace();
} catch (InterruptedException ie) {
Thread.currentThread().interrupt(); // ignore/reset
}
}
service.shutdown();
}
public static void main(String args[]){
CallableDemo demo = new CallableDemo();
}
class MyCallable implements Callable<Long>{
Long result = 0L;
public MyCallable(){
}
public Long call(){
// Add your business logic
// set the result
return result;
}
}
}
重点说明:
- future.get() 在 Callable 任务计算后返回。您可以阻止直到 Callable 完成,也可以为其设置超时时间。
- 如果收到
InterruptedException,请中断当前线程并继续。
- 别忘了致电
shutdown()