1. 程式人生 > >實現多執行緒的3種方式

實現多執行緒的3種方式

1)  繼承Thread類,重寫run()方法。

Thread類本質上也是實現了Runnable介面的一個例項,它代表一個執行緒的例項。並且,啟動執行緒的唯一方法就是通過Thread類的start()方法。start()方法是一個本地方法,它將啟動一個新執行緒,並執行run()方法(Thread類中的run()方法是一個空方法)。這種方式通過自定義直接extend Thread,並重寫run()方法,就可以啟動新執行緒並執行自己定義的run()方法。需要注意的是,呼叫start()方法後並不是立即執行多執行緒程式碼,而是使得該執行緒變為可執行狀態,什麼時候執行多執行緒程式碼是由作業系統決定的。

2)  實現Runnable介面,並實現該介面的run()方法

主要步驟如下:

A.  自定義類並實現Runnable介面,實現run()方法;

B.  建立Thread類物件,用實現Runnable介面的物件作為引數例項化該Thread類物件。

C.  呼叫Thread類的start()方法。

其實,不管是通過繼承Thread類還是通過實現Runnable介面來實現多執行緒的方法,最終還是通過Thread類物件的API來控制執行緒的。

3)  實現Callable介面,重寫call()方法

Callable介面實際上是屬於Executor框架中的功能類,Callable介面和Runnable介面的功能類似,但提供了比Runnable介面更強大的功能,主要表現為以下3點:

A.  Callable可以在任務結束後提供一個返回值,Runnable無法提供這個功能。

B.  Callable中的call()方法可以丟擲異常,而Runnable的run()方法不能丟擲異常。

C.  執行Callable可以拿到一個Future物件,Future物件表示非同步計算的結果,他提供了檢查計算是否完成的方法。由於執行緒屬於非同步計算模型,因此無法從別的執行緒中得到函式的返回值,在這種情況下,就可以使用Future來監視目標執行緒呼叫call()方法的情況,當呼叫Future中的get()方法以獲取結果時,當前執行緒就會阻塞,直到call()方法結束返回結果。

實現多執行緒的幾種方式,建議使用Runnable介面實現,因為java開發人員認為,一個類僅在他們需要被加強或者修改時才會被繼承,所以如果沒有必要重寫Thread類中的其他方法,,那麼通過繼承Thread類的實現方式和實現Runnable介面的效果相同,優先推薦Runnable介面。不管如何最終都需要thread.start( )來啟動執行緒。