Thread、Runable和Callable 三者區(qū)別?Thread 是一個抽象類,只能被繼承,而 Runable、Callable 是接口,需要實現(xiàn)接口中的方法。繼承 Thread 重寫run()方法,實現(xiàn)Runable接口需要實現(xiàn)run()方法,而Callable是需要實現(xiàn)call()方法。Thread 和 Runable 沒有返回值,Callable 有返回值,返回值可以被 Future 拿到。實現(xiàn) Runable 接口的類不能直接調用start()方法,需要 new 一個 Thread 并發(fā)該實現(xiàn)類放入 Thread,再通過新建的 Thread 實例來調用start()方法。實現(xiàn) Callable 接口的類需要借助 FutureTask (將該實現(xiàn)類放入其中),再將 FutureTask 實例放入 Thread,再通過新建的 Thread 實例來調用start()方法。獲取返回值只需要借助 FutureTask 實例調用get()方法即可!什么是 FutureTask?FutureTask 表示一個異步運算的任務。FutureTask 里面可以傳入一個Callable 的具體實現(xiàn)類,可以對這個異步運算的任務的結果進行等待獲取、判斷是否已經(jīng)完成、取消任務等操作。只有當運算完成的時候結果才能取回,如果運算尚未完成 get 方法將會阻塞。一個 FutureTask 對象可以對調用了 Callable 和 Runnable 的對象進行包裝,由于 FutureTask 也是Runnable 接口的實現(xiàn)類,所以 FutureTask 也可以放入線程池中。
線程的 run()和 start()有什么區(qū)別?通過調用 Thread 類的 start()方法來啟動一個線程, 這時此線程是處于就緒狀態(tài), 并沒有運行。這時無需等待 run 方法體代碼執(zhí)行完畢,可以直接繼續(xù)執(zhí)行下面的代碼。
方法 run()稱為線程體,它包含了要執(zhí)行的這個線程的內容,線程就進入了運行狀態(tài),開始運行 run 函數(shù)當中的代碼。 run 方法運行結束, 此線程終止。然后 CPU 再調度其它線程。
run() 可以重復調用,而 start()只能調用一次。
為什么我們調用 start() 方法時會執(zhí)行 run() 方法,為什么我們不能直接調用run() 方法?
如果直接執(zhí)行 run() 方法,會把 run 方法當成一個 main 線程下的普通方法去執(zhí)行,并不會在某個線程中執(zhí)行它,所以這并不是多線程工作。調用 start 方法方可啟動線程并使線程進入就緒狀態(tài),而 run 方法只是 thread 的一個普通方法調用,還是在主線程里執(zhí)行。
尚學堂給同學們帶來全新的Java300集課程啦!java零基礎小白自學Java必備優(yōu)質教程_手把手圖解學習Java,讓學習成為一種享受_嗶哩嗶哩_bilibili