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的區別
- Runnable執行方法是run(),Callable是call()
- 實現Runnable介面的任務執行緒無返回值;實現Callable介面的任務執行緒能返回執行結果
- 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】reduceByKey和groupByKey區別與用法
在spark中,我們知道一切的操作都是基於RDD的。在使用中,RDD有一種非常特殊也是非常實用的format——pair RDD,即RDD的每一行是(key, value)的格式。這種格式很像Python的字典型別,便於針對key進行一些處理。 針對pair RDD這樣的
sizeof和strlen()區別及用法
//sizeof是以位元組為單位計算變數或型別所佔記憶體大小,它是屬於C語言運算子系列;而strlen()是一個函式,是計算字串長度(也是以位元組為單位,但略有區別);比如: char array[] = {"ILOVE"}; printf("%d", strlen(array)); //值為5
reduceByKey和groupByKey區別與用法
轉自:https://blog.csdn.net/zongzhiyuan/article/details/49965021在spark中,我們知道一切的操作都是基於RDD的。在使用中,RDD有一種非常特殊也是非常實用的format——pair RDD,即RDD的每一行是(ke
SQL中JOIN和UNION區別、用法及示例
1.JOIN和UNION區別join 是兩張表做交連后里麵條件相同的部分記錄產生一個記錄集,union是產生的兩個記錄集(欄位要一樣的)並在一起,成為一個新的記錄集 。JOIN用於按照ON條件聯接兩個表,主要有四種:INNER JOIN:內部聯接兩個表中的記錄,僅當至少有一個同屬於兩表的行符合聯接條件時,內
StreamReader和StreamWrite和FileStream區別和用法
一、<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
Runnable與Callable區別
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包或檔
Mybatis和Hibernate區別和應用場景
hibernate: 是一個標準的ORM框架(物件關係對映)。入門門檻較高,不需要程式寫sql語句,sql語句自動生產了。 特點: 對sql的優化比較困難。 Hibernate對物件的維護和快取要比MyBatis好,對增刪改查的物件的維護要方便。 Hibernate資料庫移植性很好,MyB
KEIL、uVision和MDK區別和聯絡
--------------------------------------------- -- 時間:2018-11-26 -- 建立人:Ruo_Xiao -- 郵箱:[email protected] ----------------------------------------
多執行緒程式設計之Runnable與Callable區別
Runnable @FunctionalInterface public interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used
多線程編程之Runnable與Callable區別
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
關於union和join區別和聯絡
union和join是需要聯合多張表時常見的關聯詞,具體概念我就不說了,想知道上網查就行,因為我也記不準確。 先說差別:union對兩張表的操作是合併資料條數,等於是縱向的,要求是兩張表字段必須是相同的(Schema of both sidesof union should match.)。也就