Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?

2020-12-09 凱哥Java

Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?

在Java線程開發中,有幾種方法開啟線程?假如需要得到線程返回的信息怎麼辦?可以實現嗎?凱哥將通過源碼和大家一起分享下線程怎麼將返回值帶回來的。

一:無返回值類型的

1:繼承Thread類

2:實現Runnable接口

這兩種是大家常用的,代碼demo就截圖吧。

1:繼承Thread類的寫法

定義:一個類型需要extends thread類,然後實現thread類的run方法。

編輯

2:實現Runnable接口的寫法:

定義一個類,實現Runable接口,重新run方法。

New個thread對象,使用有參構造器,參數是runnable的。然後thread.start()

二:帶有返回值的

3:實現Callable<V>接口

操作步驟:

一個類實現Callable接口,重新call方法;

在調用的時候,需要使用FutureTask這個類的有參構造,然後再使用thread的有參構造。

最後調用task的get方法。

代碼如下:

運行結果:

Callable返回值的源碼:

我們從FutureTask這個類入手,因為返回值就是從FutureTask中獲取的。來看看類關係圖:

FutureTask實現了RunnableFuture接口,RunnableFuture接口繼承了Future和Runnable接口。

我們看RunnableFuture這個接口的時候,發現只有一個無返回值的run方法。那麼,線程返回的數據是哪個類實現的呢?其實就在FutureTask類裡面。我們在來看看FuntrueTask這個類:

重新了run方法。最後,有個set result。既然有set方法。在來看看demo中task.get()方法:

Get方法就帶有返回值的。

至此,實現callable接口帶有返回值的原因已經找到了。

4:使用線程池創建線程

使用線程池創建的線程,可以有返回值,也可以沒有返回值。使用Executory這個頂級接口來處理。

我們先來看看Executor接口的關係。如下圖:

其中看到了熟悉的ThreadPoolExecutor和ScheduledThreadPoolExecutor

4.1:使用Executor創建沒有返回值得線程:

說明:這裡不帶返回值的,其實就是調用了Runnable的run方法。

4.2:帶有返回值的demo

創建一個類,實現Callable接口。如下圖:

通過這個接口,我們知道是有返回值的。

三:總結

Java中實現線程有4種方式:

我們最熟悉的不帶換回值的兩種以及帶有返回值的兩種。分別是:

Thread、Runnable和Callable以及線程池

相關焦點

  • Java多線程帶返回值得Callable接口
    Java多線程帶返回值的Callable接口在面試的時候,有時候是不是會遇到面試會問你,Java中實現多線程的方式有幾種?你知道嗎?你知道Java中有可以返回值的線程嗎?在具體的用法你知道嗎?如果兩個線程同時來調用同一個計算對象,計算對象的call方法會被調用幾次你知道嗎?
  • Java實現多線程的方式,啊四種
    小夥伴們都知道Java實現多線程有兩種方式:1、繼承Thread類,重寫run()方法;2、實現Runnable接口,實現run()方法實際上還有兩種方式:>3、實現Callable接口,實現call()方法;4、通過線程池創建線程接下來一個一個說明:1、繼承Thread類,重寫run()方法線程類:測試類:
  • Java線程的兩種實現方式
    多線程的意義其實任何一個程序的執行都需要獲得cpu的執行權,是由cpu來去決定到底是由哪個程序來去執行,那麼多線程的存在其實就是「最大限度的利用cpu資源」,當某一個線程的處理不需要佔用cpu而之和I/O打交道的時候,讓需要佔用cpu資源的其他線程有機會獲得cpu資源。從根本上說,這就是說多線程編程的目的。
  • java的線程創建方式
    Thread類java語言中的Thread類是一個基本的線程類,用於創建線程、中斷線程、獲取線程的基本信息、運行狀態等。我們首先了解下利用Thread類創建線程實例的二種方式。繼承Thread類創建線程//繼承Thread實現自己的線程類class MyThread extends Thread{//重寫run方法,給線程賦予工作任務 @Override public void run() { //任務內容…… System.out.println("當前線程是:"+Thread.currentThread
  • 實現多線程的標準操作,基於Runnable接口實現java多線程
    1 為什麼要用Runnable上一篇文章介紹了通過繼承Thread類,實現java多線程。但如果當我們創建的這個線程類還想繼承其他類的時候,這種方法就略顯局限了。這也是java單繼承的局限性。為了避免這種局限性,所以又提供了第二種多線程主體定義的形式:實現Runnable接口。
  • 阿里真實面試題解析之實現多個線程順序執行的幾種方式
    有可能輸出A B C,有也可能輸出 B A C,是無法保證線程的順序執行的。join方式實現join方式即使用Thread.join方法來實現。Thread.join含義當前線程需要等待previousThread線程終止之後才從thread.join返回。
  • 一篇文章全面吃透Java虛擬機,線程安全的實現方法
    由於java虛擬機的多線程是通過線程輪流切換並分配處理器執行時間的方式來實現的,所以,為了線程切換後能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲,所以我們說,它是線程私有的.
  • Java基礎知識點面試手冊(線程+JDK8)
    結論:即採用多線程不會提高程序的執行速度,反而會降低速度,但是對於用戶來說,可以減少用戶的響應時間。如何指定多個線程的執行順序?(寫代碼實現)答:設定一個 orderNum,每個線程執行結束之後,更新 orderNum,指明下一個要執行的線程。並且喚醒所有的等待線程。在每一個線程的開始,要 while 判斷 orderNum 是否等於自己的要求值!!不是,則 wait,是則執行本線程。
  • 高級分享:Java多線程你真的理解透徹了嗎?帶你玩轉一次多線程!
    Java 5提供了Future 接口來代表Callable接口裡 call() 方法的返回值,並為Future 接口提供了一個FutureTask實現類,該實現類實現了Future 接口,並實現了Runnable 接口一可以作為Thread類的target。
  • 通俗易懂的告訴你「策略模式」在java多線程中的應用
    花10分鐘認真的閱讀一篇文章有時或許比敲60分鐘代碼還有效我們都知道java啟動多線程有兩種方式,一種是繼承Thread類,一種是實現Runnable接口,但是很多小夥伴可能不知道實現Runnable接口這種方式中運用了
  • JAVA並發編程:線程並發工具類Callable、Future 和FutureTask的使用
    必要時可以通過 get 方法獲取執行結果,該方法會阻塞直到任務返回結果。在Future類中一共有5個方法,如下圖所示。FutureTask 類實現了RunnableFuture 接口,RunnableFuture 繼承了Runnable接口和Future 接口,而FutureTask 實現了RunnableFuture 接口。所以它既可以作為Runnable被線程執行,又可以作為Future 得到Callable 的返回值。FutureTask,可取消的異步計算。
  • Java 線程面試題 Top 50
    不同的進程使用不同的內存空間,而所有的線程共享一片相同的內存空間。別把它和棧內存搞混,每個線程都擁有單獨的棧內存用來存儲本地數據。3) 如何在Java中實現線程?在語言層面有兩種方式。java.lang.Thread 類的實例就是一個線程但是它需要調用java.lang.Runnable接口來執行,由於線程類本身就是調用的Runnable接口所以你可以繼承java.lang.Thread 類或者直接調用Runnable接口來重寫run()方法實現線程。4) 用Runnable還是Thread?
  • Java編寫線程安全類的7個技巧
    以下示例顯示了java.lang.Math類的其中一部分:二、無共享狀態(No Shared State)如果你必須要使用狀態,那麼請不要共享狀態,即狀態應該只屬於一個單一的線程。這種技術的一個例子是SWT或Swing圖形用戶界面框架的事件處理線程。您可以通過擴展Thread類並添加實例變量來實現「本地線程」(thread-local)實例變量。
  • 面試前必看Java線程面試題
    如果將對象的方法視為對象向外界提供的服務,那麼運行時的多態性可以解釋為:當A系統訪問B系統提供的服務時,B系統有多種提供服務的方式,但一切對A系統來說都是透明的(就像電動剃鬚刀是A系統,它的供電系統是B系統,B系統可以使用電池供電或者用交流電,甚至還有可能是太陽能,A系統只會通過B類對象調用供電的方法,但並不知道供電系統的底層實現是什麼,究竟通過何種方式獲得了動力)。
  • JAVA多線程 集合同步
    詞彙解析如何以線程安全的方式使用Java List?A.)中,否則有可能拋出ConcurrentModificationException異常,如下(3)例子中所示用法。ArrayList 使用了Collections.synchronizedList(List<T> list)就一定是線程安全了嗎?答案:不是2. ArrayList 返回的迭代器iterator不是同步(synchronized)的,因此不是線程安全的,如何解決?
  • 40個Java多線程問題總結
    2、創建線程的方式比較常見的一個問題了,一般就是兩種:(1)繼承Thread類(2)實現Runnable接口至於哪個好,不用說肯定是後者好,因為實現接口的方式比繼承類的方式更靈活,也能減少程序之間的耦合度,面向接口編程也是設計模式6大原則的核心。
  • 初學Java多線程:向線程傳遞數據的三種方法
    初學Java多線程:向線程傳遞數據的三種方法 本文講述在學習Java多線程中需要學習的向線程傳遞數據的三種方法。由於線程的運行和結束是不可預料的,因此,在傳遞和返回數據時就無法象函數一樣通過函數參數和return語句來返回數據。
  • 一次線程OOM排查看線程使用注意事項
    ,再通過這個堆棧信息我們可以知道就是APP中的線程創建數量太多而導致的OOM,排查方向的重點就是要關注APP 裡面線程池使用的地方;不同頁面都會報這個錯誤,那這個問題說明不是在特定頁面產生的,是通性問題,那麼就需要來檢測整體的線程狀態來看,看看是哪裡在一直的創建線程,有了思路就開始先來分析線程狀態吧。
  • Java多線程編程必備基礎知識
    以下是線程的三種實現方式,以及對每種實現的優缺點進行分析,最後是對這三種實現方式進行總結;方式一:繼承Thread類優點:實現簡單,只需實例化繼承類的實例,即可使用線程缺點:擴展性不足,Java是單繼承的語言,如果一個類已經繼承了其他類
  • Java中枚舉的線程安全性及序列化問題
    Java SE5提供了一種新的類型-Java的枚舉類型,關鍵字enum可以將一組具名的值的有限集合創建為一種新的類型,而這些具名的值可以作為常規的程序組件使用,這是一種非常有用的功能。本文將深入分析枚舉的源碼,看一看枚舉是怎麼實現的,他是如何保證線程安全的,以及為什麼用枚舉實現的單例是最好的方式。要想看源碼,首先得有一個類吧,那麼枚舉類型到底是什麼類呢?是enum嗎?