執行緒池ThreadPool
阿新 • • 發佈:2019-01-10
以前在面試的時候遇見一個題:如果運用執行緒的時候需要返回一直值怎麼辦?由於運用執行緒時不管是繼承Thread類還是實現Runable介面在重寫run()時都沒有返回值的。
我當時給出的答案是:申請一個全域性變數,在run()方法裡面把需要返回的值賦值給全域性變數,當執行緒執行完成後直接運用該全域性變數即可。
由於今天在看網路爬蟲的時候看見了在JDK1.5以後的版本中提供輕量級執行緒池——ThreadPool,可以使用想城池來執行一組任務。簡單的任務沒有返回值沒如果主執行緒需要獲得子執行緒的返回值是可以使任務實現Callable介面,執行緒池執行任務並通過Future的例項返回執行緒的執行結果。
import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class ThreadPoolTest implements Callable { public static void main(String[] args) throws InterruptedException, ExecutionException { // TODO Auto-generated method stub int threads = 3; //併發執行緒數量 ExecutorService es = Executors.newFixedThreadPool(threads);//建立執行緒池 Set<Future<String>> set = new HashSet<Future<String>>(); for(int i = 0; i < threads; i++){ ThreadPoolTest rpt = new ThreadPoolTest(); Future<String> future = es.submit(rpt);//提交任務 set.add(future); } for(Future<String> future : set){ System.out.println(future.get()); } } static int i =0; public String call() throws Exception { // TODO Auto-generated method stub String str = "kkk" + i; i++; return str; } }
採用執行緒池可以充分的利用多核CPU的計算能力,簡化多執行緒的實現。