<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
使用Runnable和Callable介面實現多執行緒的區別
先看兩種實現方式的步驟:
1.實現Runnable介面
public class ThreadDemo{ public static void main(String[] args) { for (int i = 1; i <= 5; i++) { //建立並啟動由實現Runnable介面建立的執行緒 new Thread(new Runner(),"Thread"+i).start(); } } } //實現Runnable介面 class Runner implements Runnable{ //實現run方法 @Override public void run() { System.out.println(Thread.currentThread().getName()+"有實現Runnable介面建立"); } }
2.實現 Callable 介面
public class ThreadDemo{ public static void main(String[] args) throws ExecutionException, InterruptedException { for (int i = 1; i <= 5; i++) { //使用FutureTask儲存執行緒結果 FutureTask<String> futureTask = new FutureTask<String>(new Caller()); //建立並啟動由實現Callable建立的執行緒 new Thread(futureTask,"Thread"+i).start(); //獲取執行緒執行結果 System.out.println(futureTask.get()); } } } //實現Callable介面 class Caller implements Callable{ //實現Call介面 @Override public Object call() throws Exception { String result = Thread.currentThread().getName()+"由實現Callable介面建立"; return result; } }
從以上程式碼可以看出,使用 Callable 介面建立多執行緒時使用了 FutureTask 進行封裝,然後 FutureTask 作為引數傳給 Thread 的建構函式,而 FutureTask 的作用是存放 Callable 介面 call 方法的返回值。我們來看一下 FutureTask 的原始碼
//FutureTask實現了RunnableFuture介面 public class FutureTask<V> implements RunnableFuture<V> {} //再看RunnableFuture介面,繼承了Runnable介面 public interface RunnableFuture<V> extends Runnable, Future<V> { void run(); } //回到FutureTask,找到run方法 public void run() { ... Callable<V> c = callable; if (c != null && state == NEW) { V result; boolean ran; try { //獲取call的返回值 result = c.call(); ran = true; } catch (Throwable ex) { result = null; ran = false; setException(ex); } if (ran) set(result); } ... } //看一下set方法 protected void set(V v) { if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) { outcome = v; ... } } //再看一下FutureTask的建構函式 public FutureTask(Callable<V> callable) { if (callable == null) throw new NullPointerException(); this.callable = callable; this.state = NEW; }
從對 FutureTask 的原始碼分析,我們可以看出 FutureTask 實現了 Runnable 介面的 run 方法,在 run 方法中呼叫了 Callable 的 call 方法,將結果儲存到 result 中,通過 set 方法將結果儲存至 outcome 變數中。
通過以上分析,我們總結出使用 Runnable 和 Callable 介面的區別:
1.使用 Runnable 介面實現更加簡單,而 通過 Callable 介面建立執行緒需要 FutureTask 進行封裝;
2.通過實現 Runnable 介面建立的執行緒沒有返回值,而使用 Callable 介面建立的執行緒可以有返回結果,並儲存在 FutureTask中;
3.通過實現 Runnable 介面建立執行緒不丟擲異常,而使用 Callable 介面建立的執行緒會丟擲異常;
從以上總結可以看出,我們也可以看出 Runnable 適用於無需返回值的場景,而 Callable 介面用於需要儲存返回值的場景。
到此這篇關於Java使用Runnable和Callable實現多執行緒的區別詳解的文章就介紹到這了,更多相關Java Runnable Callable多執行緒內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45