[英]Not calling get on list of futures
我正在使用具有某些固定线程池大小的全局Executor服务。 我们有一堆相关的任务,我们提交执行并等待期货清单。
最近,我们面临CPU使用率高的问题,在调试时,我发现对期货列表中的某一项调用get()时发生了异常。 当前,我们遍历列表,整个循环周围有一个try catch。
try{
List<Result> results = new ArrayList<>()
for(Future<Result> futureResult: futureResults{
Result result = futureResult.get();
results.add(result);
}
} catch(Exception e){
throw new InternalServiceException(e);
}
//Do something with results
想知道其他线程的行为,如果将来永远不会在某些项目上调用get的话。 我尝试搜索,但找不到任何东西。
此外,这种行为是否会触发较高的CPU使用率?
http://www.journaldev.com/1650/java-futuretask-example-program
我仍将按照上面的示例检查future isDone。
如果您需要运行其他操作或想更好地利用CPU,则可以将收集器放在单独的线程中,也许每分钟左右轮询一次结果。
可以由Thread.sleep计划或处理。
Executors类提供了各种方法来在线程池中执行Callable。 由于可调用任务并行运行,因此我们必须等待返回的Object。
可调用任务返回java.util.concurrent.Future对象。 使用Future,我们可以找出Callable任务的状态并获取返回的Object。
它提供了get()方法,可以等待Callable完成,然后返回结果。
有一个get()方法的重载版本,我们可以在其中指定等待结果的时间,这对于避免当前线程阻塞更长的时间很有用。
Future提供了cancel()方法来取消关联的Callable任务。 有isDone()和isCancelled()方法来查找关联的Callable任务的当前状态。
这是Callable任务的一个简单示例,该示例在一段时间后返回执行该任务的线程的名称。 我们正在使用Executor框架并行执行10个任务,并使用Future获取已提交任务的结果。
public class FutureObjectTest implements Callable<String>{
@Override
public String call() throws Exception {
long waitTime = (long) (Math.random()*10000);
System.out.println(Thread.currentThread().getName() + " waiting time in MILISECONDS " + waitTime);
Thread.sleep(waitTime);
return Thread.currentThread().getName() + " exiting call method.";
}
public static void main(String [] args){
List<Future<String>> futureObjectList = new ArrayList<Future<String>>();
ExecutorService executorService = Executors.newFixedThreadPool(5);
Callable<String> futureObjectTest = new FutureObjectTest();
for(int i=0; i<10; i++){
Future<String> futureResult = executorService.submit(futureObjectTest);
futureObjectList.add(futureResult);
}
for(Future<String> futureObj : futureObjectList){
try {
System.out.println(futureObj.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
System.out.println("Starting get method of wait");
////////////get(Timeout) method///////
futureObjectList.clear();
for(int i=0; i<10; i++){
Future<String> futureResult = executorService.submit(futureObjectTest);
futureObjectList.add(futureResult);
}
executorService.shutdown();
for(Future<String> futureObj : futureObjectList){
try {
System.out.println(futureObj.get(2000,TimeUnit.MILLISECONDS));
} catch (InterruptedException | ExecutionException | TimeoutException e) {
e.printStackTrace();
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.