好久沒寫博客,看了下上一篇發表的時間發現已是一年多前,看到消息處的小紅點,點了下發現仍然有很多新朋友關注了我,給我留言,給我的博文點贊,讓我發現技術分享的重要性,不僅僅是影響一個人,而是影響一羣人。軟件開發是一份很潮的工作,會隨着歷史的潮頭不斷奔流不息,只有屹立潮頭的人纔不會被淘汰。逆水行舟,不進則退,多少比你差的人比你還幾倍的努力。如果你總是止步不前,拒絕新的技術,你還期望公司給你加薪,你還指望同事教你該怎麼寫代碼還拿着比同事高的工資,即使你現在還能苟延殘喘,但終究會被拋棄。
說了很多廢話,只是希望自己警醒,希望認同上述觀點的人同樣能感受到那些每天看凌晨三點太陽的人的壓力,其他不認同的人大概可以跳過直接看下面的內容。本文要寫的內容是關於線程,工作中有些寫業務代碼的開發這塊用得比較少,但是面試時面試官總喜歡問多線程相關問題,例如下面這些:
1)什麼是線程
2)怎麼樣實現多線程
3)有沒有用過線程池
4)怎麼樣實現一個線程池
5)不要線程池可不可以
……
這些問題大家可以思考下,本文不對上述問題進行解答。大家都知道new一個線程或者實現Ruannable接口,調度這些線程是沒有返回值的,如果我們需要線程任務處理完畢會返回一個成功與否的標誌,那麼可以採用下面的方式
public class Task implements Callable<String> {
private int id;
public Task(int id) {
this.id = id;
}
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
@Override
public String call() throws Exception {
return "線程號:" + Thread.currentThread().getId();
}
}
線程類沒有實現Runnable接口,而是實現Callable接口的call方法。
public class Test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
ArrayList<Future<String>> list = new ArrayList<Future<String>>();
for (int i =0;i<10;i++){
list.add(executorService.submit(new Task(i)));
}
for(Future<String> future : list){
System.out.println(future.get());
}
}
}
創建了一個緩存線程池(線程池的線程數會動態伸縮),將線程任務放到線程池中執行,結果被保存到Future泛型的List中。最後打印出所有線程任務的結果。
大家可以思考下線程池執行任務返回結果是同步還是異步的,這種同步或者異步的效果又是通過什麼方式實現的,我們拿到的結果是否真實。