聊聊java中的線程
堅持原創,寫好每一篇文章
随着使用者量的逐漸增多,請求越來越多,并發問題随之而來,線程的學習自然也成了重點内容,也是出去找工作不得不進行準備的知識點。
線程的實作方式
對于線程的實作方式是一個老生常談的問題了,可以通過實作Runnable接口重寫run()方法實作,可以實作Callable接口,也可以繼承Thread類來實作。Runnable和Callable的差別在于前者執行任務後不傳回資料,而實作Callable接口的線程執行任務後可以傳回結果資料。
具體而言,定義XppCallable類,實作Callable接口,需要重寫的是call()方法,這個方法就是定義傳回的資料值。
ExecutorService exec = Executors.newCachedThreadPool();
ArrayList<Future<String>> results =
new ArrayList<Future<String>>();
for(int i = 0; i < 10; i++)
results.add(exec.submit(new XppCallable(i)));
通過定義線程池執行線程後,XppCallable線程的所有結果集都會儲存到了這個results結果集合中。由于這個結果集是個所有線程的結果集的累加,是以我們在進行周遊這個集合的時候有可能被阻塞,因為有可能線程還沒有傳回結果,它就一直在那裡等着。
for(Future<String> fs : results){
System.out.println(fs.get());
}
這裡是調用Future接口中的get()方法來擷取值,除此以外,Future接口還提供了包含逾時時間的get()方法和檢測線程是否完成任務的方法isDone()方法。
啟動線程
對于線程的啟動直接new Thread()建立線程然後調用start()方法啟動就可以了。我們還可以使用線程池建立Executor執行器來還線上程,具體是調用ExecutorService執行個體的execute()方法
代碼如下所示:
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0; i < 6; i++)
exec.execute(new XppThread());
exec.shutdown();
}
對于線程池的分類也是老生常談的東西,這裡用到的是可緩存的線程池,超過一定長度會回收空閑的線程池,除此以外,還有固定線程數量的線程池,隻有一個線程的線程池。
join()方法
總結
❤️ 感謝大家
- 歡迎關注我❤️,點贊👍🏻,評論🤤,轉發🙏
- 關注
,定期為你推送好文,還有群聊不定期抽獎活動,可以暢所欲言,與大神們一起交流,一起學習。盼盼小課堂
- 有不當之處歡迎批評指正。