1. 程式人生 > >Runnable和Callable的區別和用法

Runnable和Callable的區別和用法

建立執行緒的四種方式

Java多執行緒實現方式主要有四種:繼承Thread類、實現Runnable介面、實現Callable介面通過FutureTask包裝器來建立Thread執行緒、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。

其中前兩種方式執行緒執行完後都沒有返回值,後兩種是帶返回值的。

Runnable和Callable的區別

Runnable介面

public interface Runnable {
    void run();
}

Callable介面

public interface Callable<V> {
    V call() throws Exception;
}

Runnable和Callable的區別

  1. Runnable執行方法是run(),Callable是call()
  2. 實現Runnable介面的任務執行緒無返回值;實現Callable介面的任務執行緒能返回執行結果
  3. call方法可以丟擲異常,run方法若有異常只能在內部消化

注意

Callable介面支援返回執行結果,需要呼叫FutureTask.get()方法實現,此方法會阻塞主執行緒直到獲取結果;當不呼叫此方法時,主執行緒不會阻塞!
如果執行緒出現異常,Future.get()會丟擲throws InterruptedException或者ExecutionException;如果執行緒已經取消,會爬出CancellationException

Runnable示例

public class CallableDemo {
    public static void main(String[] args) {
        //建立一個定長的核心執行緒和最大執行緒數都是1的FixedThreadPool執行緒池
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        Callable<String> callable = new Callable<String>() {
            @Override
            public
String call() throws Exception { Thread.sleep(3000); System.out.println("Thread_current="+Thread.currentThread()); return "Hello world"; } }; System.out.println("start"); // 執行任務並獲取Future物件 Future<String> future = executorService.submit(callable); try{ //future.get()執行緒結果,會阻塞當前執行緒直到執行緒結束 System.out.println("future.get()="+future.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } System.out.println("end"); // 關閉執行緒池 executorService.shutdown(); } }

其它

在程式開發中只要是多執行緒肯定永遠以實現Runnable介面為主,因為實現Runnable介面相比繼承Thread類有如下好處:

  • 避免點繼承的侷限,一個類可以實現多個介面
  • 資源共享

Runnable介面和Thread之間的聯絡

public class Thread extends Object implements Runnable 

由此可見:Thread類也是Runnable介面的子類

相關推薦

export ,export default import 區別 以及用法

彈出 但是 clas 能夠 引用 port 模塊 返回值 兩個 首先要知道export,import ,export default是什麽 ES6模塊主要有兩個功能:export和import export用於對外輸出本模塊(一個文件可以理解為一個模塊)變量的接口 imp

js中!!!的區別用法簡介

js中!的用法是比較靈活的,它除了做邏輯運算常常會用!做型別判斷,可以用!與上物件來求得一個布林值, 1、!可將變數轉換成boolean型別,null、undefined和空字串取反都為false,其餘都為true。 複製程式碼 1 !null=true 2 3

【Spark系列2】reduceByKeygroupByKey區別用法

在spark中,我們知道一切的操作都是基於RDD的。在使用中,RDD有一種非常特殊也是非常實用的format——pair RDD,即RDD的每一行是(key, value)的格式。這種格式很像Python的字典型別,便於針對key進行一些處理。 針對pair RDD這樣的

sizeofstrlen()區別用法

//sizeof是以位元組為單位計算變數或型別所佔記憶體大小,它是屬於C語言運算子系列;而strlen()是一個函式,是計算字串長度(也是以位元組為單位,但略有區別);比如: char array[] = {"ILOVE"}; printf("%d", strlen(array)); //值為5

reduceByKeygroupByKey區別用法

轉自:https://blog.csdn.net/zongzhiyuan/article/details/49965021在spark中,我們知道一切的操作都是基於RDD的。在使用中,RDD有一種非常特殊也是非常實用的format——pair RDD,即RDD的每一行是(ke

SQL中JOINUNION區別用法及示例

1.JOIN和UNION區別join 是兩張表做交連后里麵條件相同的部分記錄產生一個記錄集,union是產生的兩個記錄集(欄位要一樣的)並在一起,成為一個新的記錄集 。JOIN用於按照ON條件聯接兩個表,主要有四種:INNER JOIN:內部聯接兩個表中的記錄,僅當至少有一個同屬於兩表的行符合聯接條件時,內

StreamReaderStreamWriteFileStream區別用法

一、<1>StreamReader類共有10個建構函式 StreamReader (Stream)    //  為指定的流初始化 StreamReader 類的新例項。 [csharp] view plaincopy FileStream fs = 

lua中 pairs ipairs區別 用法

標準庫提供了集中迭代器,包括迭代檔案每行的(io.lines),迭代table元素的(pairs),迭代陣列元素的(ipairs),迭代字串中單詞的  (string.gmatch)等等。LUA手冊中對與pairs,ipairs解釋如下 ipairs(t) Re

export ,export default import 區別以及用法

默認 函數 根據 pre 可用 返回 大括號 能夠 返回值 首先要知道export,import ,export default是什麽 ES6模塊主要有兩個功能:export和importexport用於對外輸出本模塊(一個文件可以理解為一個模塊)變量的接口import用

知識點 - python 裝飾器@staticmethod@classmethod區別使用

定義 整潔 參數 sel spa elf pri Go assm 1.通常來說,我們使用一個類的方法時,首先要實例化這個類,再用實例化的類來調用其方法 class Test(object): """docstring for Test""" def

hashCode() equals() 區別作用(轉)

person set集合 static out fin 解決 詳細 返回 art 出處:https://www.jianshu.com/p/5a7f5f786b75 本章的內容主要解決下面幾個問題: 1 equals() 的作用是什麽? 2 equal

RunnableCallable區別

exit getname 可用 clas java get() class try fin Callable接口: public interface Callable<V> { V call() throws Exception; } Runnab

Java之JSONObject存取值以及HashMap區別, optString()getString()區別他的遍歷方式

結論: 1.JSONObject和HashMap用法上是一樣的,用put()方法存對於的Key-values鍵值對,取可用optString(key)和getString(key),get(key),存入的是什麼型別,取出來的時候就是什麼型別 2**.optString()在沒找到k

spring classpath:classpath*:區別實際應用

classpath:和classpath*:的含義 classpath: :表示從類路徑中載入資源,classpath:和classpath:/是等價的,都是相對於類的根路徑。資原始檔庫標準的在檔案系統中,也可以在JAR或ZIP的類包中。 classpath*::假設多個JAR包或檔

MybatisHibernate區別應用場景

hibernate: 是一個標準的ORM框架(物件關係對映)。入門門檻較高,不需要程式寫sql語句,sql語句自動生產了。 特點: 對sql的優化比較困難。 Hibernate對物件的維護和快取要比MyBatis好,對增刪改查的物件的維護要方便。 Hibernate資料庫移植性很好,MyB

KEIL、uVisionMDK區別聯絡

--------------------------------------------- -- 時間:2018-11-26 -- 建立人:Ruo_Xiao -- 郵箱:[email protected] ----------------------------------------

多執行緒程式設計之RunnableCallable區別

Runnable @FunctionalInterface public interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used

多線程編程之RunnableCallable區別

cond 的區別 stat result tel 基本上 ace 哈哈 separate Runnable @FunctionalInterface public interface Runnable { /** * When an object impl

Java 的equals()方法 == 的區別聯絡

淺談Java中的equals和==  在初學Java時,可能會經常碰到下面的程式碼: String str1 = new String("hello"); String str2 = new String("hello"); System.out.print

關於unionjoin區別聯絡

union和join是需要聯合多張表時常見的關聯詞,具體概念我就不說了,想知道上網查就行,因為我也記不準確。 先說差別:union對兩張表的操作是合併資料條數,等於是縱向的,要求是兩張表字段必須是相同的(Schema of both sidesof union should match.)。也就