java創建實現多線程的方式
一、Java使用多線程主要有三種方式:
第一種:繼承Thread類
步驟:① 定義一個類,繼承Thread類,並重寫Thead類的run方法,run方法內的內容為該線程要執行的任務。run方法也被稱為執行體。
② 創建Thead子類的實例,即創建線程對象。
③ 使用線程的start方法啟動線程。
第二種:實現Runnable方法
步驟:① 定義一個類,實現Runnable接口,並重寫該接口的run方法,run方法體仍然是執行體。
② 創建一個Thead類的實例,並將實現Runnable接口的類的實例作為參數傳入Thead類的構造器中。
③ 調用Thread類實例的start方法啟動線程。
第三種:實現Callable接口(需使用Future接口的實現類配合)
步驟:① 定義一個類A,實現Callable接口,並重寫該接口的call方法,call方法體仍然是執行體,call方法有返回值。
② 創建實現Callable接口的類A的實例B,並使用Future接口的實現類FutureTask子類包裝B,FutureTask對象封裝了B的call方法的返回值。
③ 創建一個Thead類的實例,並將FutureTask的類的實例作為參數傳入Thead類的構造器中。
④ 調用Thread類實例的start方法啟動線程。
⑤ 需要時,調用FutureTask類的實例的get方法獲取call方法的返回值。
二、創建線程的三種方式的對比
采用實現Runnable、Callable接口的方式創建多線程時,優勢是:
線程類只是實現了Runnable接口或Callable接口,還可以繼承其他類(java類可實現多個接口,但只能繼承一個父類)。
在這種方式下,多個線程可以共享同一個target對象,所以非常適合多個相同線程來處理同一份資源的情況,從而可以將CPU、代碼和數據分開,形成清晰的模型,較好地體現了面向對象的思想。
劣勢是:
編程稍微復雜,如果要訪問當前線程,則必須使用Thread.currentThread()方法。
使用繼承Thread類的方式創建多線程時優勢是:
編寫簡單,如果需要訪問當前線程,則無需使用Thread.currentThread()方法,直接使用this即可獲得當前線程。
劣勢是:
線程類已經繼承了Thread類,所以不能再繼承其他父類。
三、使用線程池執行線程
jdk1.5之後新增的java.util.concurrent包中提供了很多種線程池的實現:
可以使用 Executors 就行創建,只需創建線程對象,放入調用ExecutorService的execute方法並將創建的線程對象傳入即可,無需用戶再手動啟動線程,
同時可以提高線程的利用率。
java創建實現多線程的方式