繁体   English   中英

不打电话获得期货清单

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM