java面试-Java并发编程(九)——批量获取多条线程的执行结果
生活随笔
收集整理的這篇文章主要介紹了
java面试-Java并发编程(九)——批量获取多条线程的执行结果
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
當向線程池提交callable任務后,我們可能需要一次性獲取所有返回結果,有三種處理方法。
方法一:自己維護返回結果
// 創建一個線程池 ExecutorService executorService = Executors.newFixedThreadPool(10);// 存儲執行結果的List List<Future<String>> results = new ArrayList<Future<String>>();// 提交10個任務 for ( int i=0; i<10; i++ ) {Future<String> result = executorService.submit( new Callable<String>(){public String call(){int sleepTime = new Random().nextInt(1000);Thread.sleep(sleepTime);return "線程"+i+"睡了"+sleepTime+"秒";}} );// 將執行結果存入results中results.add( result ); }// 獲取10個任務的返回結果 for ( int i=0; i<10; i++ ) {// 獲取包含返回結果的future對象Future<String> future = results.get(i);// 從future中取出執行結果(若尚未返回結果,則get方法被阻塞,直到結果被返回為止)String result = future.get();System.out.println(result); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
此方法的弊端:
方法二:使用ExecutorService的invokeAll函數
本方法能解決第一個弊端,即并不需要自己去維護一個存儲返回結果的容器。當我們需要獲取線程池所有的返回結果時,只需調用invokeAll函數即可。?
但是,這種方式需要你自己去維護一個用于存儲任務的容器。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
方法三:使用CompletionService
CompletionService內部維護了一個阻塞隊列,只有執行完成的任務結果才會被放入該隊列,這樣就確保執行時間較短的任務率先被存入阻塞隊列中。
ExecutorService exec = Executors.newFixedThreadPool(10);final BlockingQueue<Future<Integer>> queue = new LinkedBlockingDeque<Future<Integer>>( 10); //實例化CompletionService final CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>( exec, queue); // 提交10個任務 for ( int i=0; i<10; i++ ) {executorService.submit( new Callable<String>(){public String call(){int sleepTime = new Random().nextInt(1000);Thread.sleep(sleepTime);return "線程"+i+"睡了"+sleepTime+"秒";}} ); }// 輸出結果 for ( int i=0; i<10; i++ ) {// 獲取包含返回結果的future對象(若整個阻塞隊列中還沒有一條線程返回結果,那么調用take將會被阻塞,當然你可以調用poll,不會被阻塞,若沒有結果會返回null,poll和take返回正確的結果后會將該結果從隊列中刪除)Future<String> future = completionService.take();// 從future中取出執行結果,這里存儲的future已經擁有執行結果,get不會被阻塞String result = future.get();System.out.println(result); }總結
以上是生活随笔為你收集整理的java面试-Java并发编程(九)——批量获取多条线程的执行结果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ffmpeg使用总结
- 下一篇: Java中的定时器