回覆列表
-
1 # 架構師成長錄
-
2 # 星辰大洋
在java語言中,執行緒的類名是Thread,有兩種方式建立執行緒:直接建立Thread物件或者建立執行緒池,由執行緒池來管理執行緒。
直接建立Thread物件我們可以直接用預設建構函式建立一個執行緒
Thread thread = new Thread();
然後呼叫它的start方法來啟動執行緒:
thread.start();
此時執行緒並不會執行業務程式碼,很快就會執行完畢。
要想讓執行緒執行目的碼,有多種方式:
1、將目的碼編寫在一個實現了Runnable介面的類的run方法中,建立執行緒時,用這個類的例項作為建構函式引數;
或者直接建立一個Runnable介面的匿名子類,用這個
2、建立一個Thread類的子類,在子類重寫run方法,在run方法中實現業務:
然後再建立一個Thread子類例項,並呼叫start方法執行業務程式碼
或者建立一個Thread的匿名子類:
使用執行緒池Executors類提供了四類建立執行緒池的靜態方法,它們都會返回ExecutorService介面的例項,這些例項就是執行緒池,只需要呼叫它的submit方法,將要執行的任務提交給執行緒池,執行緒池就會按照自己的策略來執行任務。而這個任務,就是實現了Runnable介面的物件。
java裡面建立執行緒有四種方式,這四種方式可以透過是否有返回值進行區分:
無返回
1. 建立任務,實現Runnable介面,重寫run();
2. 繼承Thread類,重寫run();
有返回
1. 實現Callable介面,重寫call(),利用FutureTask包裝Callable,並作為task傳入Thread建構函式;
2. 使用執行緒池。
首先我們來看下執行緒之間的狀態,及他們之間的相互轉換:
實現Runnable介面因為Java只支援單繼承,繼承了Thread類就不能再繼承別的類了,所以實現繼承更推薦讓執行緒類實現Runnable介面。將Runnbale作為引數傳入Thread的建構函式,建立Thread。
繼承Thread類,重寫run()建立執行緒只需要繼承Thread類,然後在run()方法裡寫下執行緒要實現的任務即可;透過呼叫start方法來啟動執行緒,但不能直接呼叫run()方法。
① Thread類本質上是實現了Runnable介面,代表一個執行緒的例項。
② Runnable介面只有一個抽象的run()方法。
④ start()方法是一個native方法,它將啟動一個新的執行緒,並執行run()方法。
⑤ 自定義類直接繼承Thread,並重寫run()方法,就可以啟動新執行緒並執行自己定義的run()方法。
利用Callable介面建立並啟動① 定義MyClass實現Callable介面;
② 重寫call(),將執行的程式碼邏輯植入;
FutureTask futuretask = new FutureTask(newMyClass());
④ 建立Thread的物件;
Thread thread = new Thread(futuretask);//傳入引數Runnable介面
⑤ 啟動執行緒;thread.start();
⑥ 可透過FutureTask類的get()方法獲得執行緒執行結束後的返回值,即call的返回值。futuretask.get();
透過執行緒池來建立執行緒① new ThreadPoolExecutor(…);
② 建立任務Task implements Callable,重寫run()方法;
④ 獲取返回值。
示例程式碼如下:
總結執行緒的建立有四種方式:主要分為有返回和無返回,具體根據使用場景來選擇。
① 如果不需要返回且執行緒數量小,則建議採用實現Runnable介面,重寫run()的方式;
② 如果需要返回且執行緒數量小,則建議採用實現Callable介面,重寫call(),利用FutureTask包裝成一個Runnable,再作為引數傳入Thread的構造方法的方式建立執行緒;