簡體   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