成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

線程的故事:我的3位母親成就了優秀的我!

開發 前端
本文使用第一人稱“我”(Thread)的視角講了線程創建的三種方式,第一種是繼承 Thread,但因為 Java 語言不允許多繼承,所以當繼承了 Thread 之后就不能繼承其他類了,于是就有了第二種方式實現 Runnable 接口的方式。

大家好,我是線程,我的英文名叫 Thread,別看我現在風光無限,好像人盡皆知的樣子,然而我的身世卻悲慘離奇。

我出身在一個小山村,那是一個與世隔絕的世外桃源,然而年紀輕輕的我,卻展現出了與眾不同的性格。比如:當身邊的同齡人還在沉浸于玩泥巴的喜悅時,我就開始思考如何避免下雨天對出行造成的阻礙?當身邊的同齡人還在沉浸于夕陽下的奔跑時,我已經開始思考為什么太陽會東升西落?而我們人類又為什么會生存在地球上?于此可見一斑。

當時的我在所有人眼里就是一個“怪人”,村里面的阿貓、阿狗走路都要躲著我。但我的母親懂我,她知道這個小伙子器宇不凡、骨骼驚奇,必是練武奇才,將來保護宇宙的重任和維護世界和平的重任可能要交付與我這個神童身上了,于是在我剛滿 3 歲那天,母親就把我過繼給了她的一位遠房親戚了。

首位母親:繼承Thread

接下來我要把我的出生過程演示給你看,這也是我的第一段人生經歷。

創建方式一

線程最原始的創建方式,只需要繼承 Thread 類,重寫 run() 方法即可,實現代碼如下:

  1. // 創建方式 1:繼承 Thread 
  2. class MyThread extends Thread { 
  3.     @Override 
  4.     public void run() { 
  5.         System.out.println("你好,線程~"); 
  6.     } 
  7. // 測試 
  8. public class ThreadExample { 
  9.     public static void main(String[] args) { 
  10.         // 創建線程 
  11.         Thread thread = new MyThread(); 
  12.         // 啟動線程 
  13.         thread.start(); 
  14.     } 

變種方法

以上創建線程的方式略顯繁瑣,我們也可以使用匿名對象的方式,在創建 Thread 類的時候就直接重寫 run() 方法,實現代碼如下:

  1. // 變種 1:匿名方式創建線程 
  2. Thread t1 = new Thread() { 
  3.     @Override 
  4.     public void run() { 
  5.         System.out.println("線程變種"); 
  6.     } 
  7. }; 
  8. // 啟動線程 
  9. t1.start(); 

繼承Thread的缺點

Java 語言的設計是單繼承,所以當繼承了 Thread 之后,就不能再繼承其他類了。

也就是說,如果我一直呆在親生母親(extends Thread)的身邊,那么就得不到好的教育,所以長大之后也注定會普普通通,這可能就是母親把我過繼給遠房親戚的原因吧。

第二位母親:實現Runnable

在 Java 語言中,雖然不能實現多繼承,但可以實現多接口,所以我在第二位母親家,過得也算如魚得水。

創建方式二

和繼承 Thread 類差不多,實現 Runnable 接口也是重寫 run() 方法,具體實現代碼如下:

  1. public class ThreadExample2 { 
  2.     // 創建方式 2:實現 Runnable 接口 
  3.     static class MyThread implements Runnable { 
  4.         @Override 
  5.         public void run() { 
  6.             System.out.println("你好,線程~"); 
  7.         } 
  8.     } 
  9.     // 代碼測試 
  10.     public static void main(String[] args) { 
  11.         // 創建 Runnable 子類 
  12.         MyThread myThread = new MyThread(); 
  13.         // 創建線程 
  14.         Thread thread = new Thread(myThread); 
  15.         // 啟動線程 
  16.         thread.start(); 
  17.     } 

變種方法1:匿名Runnable

以上實現 Runnable 的接口有更簡單的實現方法,我們可以使用匿名 Runnable 來創建一個線程,如下代碼所示:

  1. // 變種 1:匿名 Runnable 方式 
  2. Thread t2 = new Thread(new Runnable() { 
  3.     @Override 
  4.     public void run() { 
  5.         System.out.println("我是線程變種方法~"); 
  6.     } 
  7. }); 
  8. // 啟動線程 
  9. t2.start(); 

變種方法2:Lambda創建Runnable

在 JDK 8 之后,我們可以使用 Lambda 表達式來操作代碼了,所以對于創建匿名 Runnable 類,我們也有了更簡單的實現方法,如下代碼所示:

  1. // 變種 2:使用 Lambda 匿名 Runnable 方式 
  2. Thread t3 = new Thread(() -> { 
  3.     System.out.println("我是變種 2~"); 
  4. }); 
  5. // 啟動線程 
  6. t3.start(); 

注意:以上實現代碼只支持 JDK 1.8+ 版本。

第三位母親:村里的首富

雖然我的前兩位母親對我都很好,但對于我這樣一個氣宇軒揚、骨骼驚奇將來要拯救宇宙和維護世界和平的少年來說,只在國內混未免局限性太大,所以我一直想去大洋彼岸追尋自己的夢想,然而以「前兩位」母親的財力不足以支撐我這樣做。

然而我的第二個家庭和村里的首富一家是至交,得知我的志向之后,他們一家愿意傾囊相授,舉一家之力幫我去大洋彼岸追尋我的夢想。于是在感激之余,我的第二位母親讓我當場認下首富一家為我的干爹、干媽。就這樣,我就有了第三位母親了。

創建方式三

前兩種創建方式雖然不錯,但都不能接收線程執行之后的返回值,于是在 JDK 1.5 之后就加入了 Callable 和 Futrue,用于接收線程執行之后的返回值,具體的實現代碼如下:

  1. import java.util.Random; 
  2. import java.util.concurrent.Callable; 
  3. import java.util.concurrent.ExecutionException; 
  4. import java.util.concurrent.FutureTask; 
  5.  
  6. /** 
  7.  * 線程創建示例 3 
  8.  */ 
  9. public class CreateThreadExample3 { 
  10.     // 創建方式 3:實現 Callable 接口 
  11.     static class MyCallable implements Callable<Integer> { 
  12.  
  13.         @Override 
  14.         public Integer call() throws Exception { 
  15.             int num = new Random().nextInt(10); 
  16.             System.out.println("生成隨機數:" + num); 
  17.             return num; 
  18.         } 
  19.     } 
  20.     // 代碼測試 
  21.     public static void main(String[] args) throws ExecutionException, InterruptedException { 
  22.         // 創建 Callable 子對象 
  23.         MyCallable callable = new MyCallable(); 
  24.         // 使用 FutureTask 配合 Callable 子對象得到執行結果 
  25.         FutureTask<Integer> futureTask = new FutureTask<>(callable); 
  26.         // 創建線程 
  27.         Thread thread = new Thread(futureTask); 
  28.         // 啟動線程 
  29.         thread.start(); 
  30.         // 得到線程執行的結果 
  31.         int result = futureTask.get(); 
  32.         System.out.println("主線程中拿到子線程執行結果:" + result); 
  33.     } 

以上代碼的執行結果如下:

從以上結果可以看出,使用 Callable 配合 FutrueTask 可以正確拿到線程執行之后的返回值。而我的故事也在這里結束了,我最終不負三位母親所望,雖不能拯救宇宙和維護世界和平,但卻也能在程序界作出自己的一些貢獻,這就是我和我三位母親的故事。

總結

本文使用第一人稱“我”(Thread)的視角講了線程創建的三種方式,第一種是繼承 Thread,但因為 Java 語言不允許多繼承,所以當繼承了 Thread 之后就不能繼承其他類了,于是就有了第二種方式實現 Runnable 接口的方式。然而前兩種實現雖然可以創建線程,但不能接收線程執行之后的返回值,于是就有了第三種實現 Callable,通過它我們可以取得線程執行之后的返回值。

 

責任編輯:姜華 來源: Java中文社群
相關推薦

2013-10-09 09:39:17

開源

2009-10-16 14:30:00

2012-08-27 13:44:01

Google

2014-06-27 09:17:53

程序員

2014-06-27 18:22:19

2023-02-07 09:37:08

流計算

2020-12-03 19:18:07

開發工具開發

2020-02-06 11:30:08

代碼JavaScript&&

2013-07-17 14:13:08

產品產品失敗

2011-09-08 14:24:57

51cto 51CTO

2012-05-25 10:54:24

程序員

2009-12-17 16:47:57

APC

2016-08-31 07:02:51

2023-12-27 17:20:09

2015-04-13 18:29:54

H3 BPM

2020-06-12 09:07:03

技術總監數據庫

2020-08-06 16:55:37

虛擬化底層計算機

2018-02-02 12:12:46

開始習慣代碼經驗

2020-04-03 09:45:09

Java多線程接口

2013-06-05 13:27:16

軟件糾錯
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩不卡在线 | 国产一区欧美 | 成人免费视频网站在线看 | 国产精品视频免费观看 | 亚洲欧美精品国产一级在线 | 手机日韩 | www.日本国产 | 国产精品亚洲一区二区三区在线 | 国产精品久久久久免费 | 亚洲国产成人久久久 | 日韩激情在线 | 中文字幕在线视频精品 | 盗摄精品av一区二区三区 | 毛片入口 | 一区二区久久精品 | 无码一区二区三区视频 | 99精品免费 | www.玖玖玖 | 国产丝袜一区二区三区免费视频 | 国产午夜精品视频 | 亚洲精品1区 | 国产精品无码久久久久 | www久久国产 | 成人在线观看免费 | 国产99热精品 | 亚洲综合资源 | 伊人在线视频 | 一级在线视频 | 国产精品视频久久久 | 国产精品成av人在线视午夜片 | 狠狠操天天操 | 欧美黑人巨大videos精品 | 日本三级播放 | 国产乱肥老妇国产一区二 | a级免费观看视频 | 成年视频在线观看福利资源 | 成人午夜电影在线观看 | 成人深夜福利在线观看 | 丁香综合 | 中文字幕亚洲一区二区三区 | 国产精品国产三级国产aⅴ无密码 |