Java 建立執行緒的方式
想必大家在Java面試中經常會被問到有關執行緒的問題,最常見的莫過於“Java有哪幾種建立執行緒的方式呢?”
稍稍瞭解過,或者在日常開發中也都會用到以下幾種方式:
①繼承Thread類(真正意義上的執行緒類),是Runnable介面的實現。
②實現Runnable介面,並重寫裡面的run()方法。
③實現Callable介面,重寫call()方法,有返回值。
④使用Executor框架建立執行緒池。Executor框架是juc(java.util.concurrent)包裡提供的執行緒池的實現。
但我這裡想說的是,其實以上所有的建立執行緒的方式,其底層都是實現了Runnable介面。
首先是Thread類(真正意義上的執行緒類):
他實現了Runnable介面的run()方法,繼承Thread類後,你可以重寫run()方法實現執行緒要完成的功能;
當然,Thread類中還定義大量用於執行緒轉換的方法,這個可以見下圖(侵刪):
PS:notify()、notifyAll()、wait()是Object類的方法
再是實現Callable介面:
實現Callable介面的類先需要用FutureTask類包裝後,再Thread類包裝後才能呼叫start()方法。(三個Thread物件包裝一個類物件,就實現了資源共享)。FutureTask包裝類也是實現了Runnable的子介面RunnableFuture<V>。
最後是使用Executor框架建立執行緒池:
執行緒池就是限制系統中使用執行緒的數量以及更好的使用執行緒
需要啟執行緒的話,就從執行緒池裡取一個。當使用完了,就“關閉”執行緒,這不是正在意義上的關閉,只是把執行緒放回到我們的池裡,供其他人在使用。
底層是Worker + workQueue(BlockingQueue<Runnable> )實現的
Worker物件它實現了Runnable介面,你把它當成Runnable的一個代理類即可,最終也是執行它的run()方法。
回頭有空貼原始碼,現在機器上是JDK9的,考慮貼JDK8 。