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

死磕 Java線程系列之創建線程的8種方式

開發 后端
創建線程,是多線程編程中最基本的操作,彤哥總結了一下,大概有8種創建線程的方式,你知道嗎?

 

簡介

創建線程,是多線程編程中最基本的操作,彤哥總結了一下,大概有8種創建線程的方式,你知道嗎?

繼承Thread類并重寫run()方法

 

  1. public class CreatingThread01 extends Thread {  
  2.     @Override  
  3.     public void run() {  
  4.         System.out.println(getName() + " is running");  
  5.     }  
  6.     public static void main(String[] args) {  
  7.         new CreatingThread01().start();  
  8.         new CreatingThread01().start();  
  9.         new CreatingThread01().start();  
  10.         new CreatingThread01().start();  
  11.     }  

繼承Thread類并重寫run()方法,這種方式的弊端是一個類只能繼承一個父類,如果這個類本身已經繼承了其它類,就不能使用這種方式了。

實現Runnable接口

 

  1. public class CreatingThread02 implements Runnable {  
  2.     @Override  
  3.     public void run() {  
  4.         System.out.println(Thread.currentThread().getName() + " is running");  
  5.     }  
  6.     public static void main(String[] args) {  
  7.         new Thread(new CreatingThread02()).start();  
  8.         new Thread(new CreatingThread02()).start();  
  9.         new Thread(new CreatingThread02()).start();  
  10.         new Thread(new CreatingThread02()).start();  
  11.     }  

實現Runnable接口,這種方式的好處是一個類可以實現多個接口,不影響其繼承體系。

匿名內部類

 

  1. public class CreatingThread03 {  
  2.     public static void main(String[] args) {  
  3.         // Thread匿名類,重寫Thread的run()方法  
  4.         new Thread() {  
  5.             @Override  
  6.             public void run() {  
  7.                 System.out.println(getName() + " is running");  
  8.             }  
  9.         }.start();  
  10.         // Runnable匿名類,實現其run()方法  
  11.         new Thread(new Runnable() {  
  12.             @Override  
  13.             public void run() {  
  14.                 System.out.println(Thread.currentThread().getName() + " is running");  
  15.             }  
  16.         }).start();       
  17.         // 同上,使用lambda表達式函數式編程  
  18.         new Thread(()-> 
  19.             System.out.println(Thread.currentThread().getName() + " is running");  
  20.         }).start();  
  21.     }  

使用匿名類的方式,一是重寫Thread的run()方法,二是傳入Runnable的匿名類,三是使用lambda方式,現在一般使用第三種(java8+),簡單快捷。

實現Callabe接口

 

  1. public class CreatingThread04 implements Callable<long> {  
  2.     @Override  
  3.     public Long call() throws Exception {  
  4.         Thread.sleep(2000);  
  5.         System.out.println(Thread.currentThread().getId() + " is running");  
  6.         return Thread.currentThread().getId();  
  7.     }  
  8.     public static void main(String[] args) throws ExecutionException, InterruptedException {  
  9.         FutureTask<long> task = new FutureTask&lt;&gt;(new CreatingThread04());  
  10.         new Thread(task).start();  
  11.         System.out.println("等待完成任務");  
  12.         Long result = task.get();  
  13.         System.out.println("任務結果:" + result);  
  14.     }  

實現Callabe接口,可以獲取線程執行的結果,FutureTask實際上實現了Runnable接口。

定時器(java.util.Timer)

 

  1. public class CreatingThread05 {  
  2.     public static void main(String[] args) {  
  3.         Timer timer = new Timer();  
  4.         // 每隔1秒執行一次  
  5.         timer.schedule(new TimerTask() {  
  6.             @Override  
  7.             public void run() {  
  8.                 System.out.println(Thread.currentThread().getName() + " is running");  
  9.             }  
  10.         }, 0 , 1000);  
  11.     }  

使用定時器java.util.Timer可以快速地實現定時任務,TimerTask實際上實現了Runnable接口。

線程池

 

  1. public class CreatingThread06 {  
  2.     public static void main(String[] args) {  
  3.         ExecutorService threadPool = Executors.newFixedThreadPool(5);  
  4.         for (int i = 0; i &lt; 100; i++) {  
  5.             threadPool.execute(()-&gt; System.out.println(Thread.currentThread().getName() + " is running"));  
  6.         }  
  7.     }  

使用線程池的方式,可以復用線程,節約系統資源。

并行計算(Java8+)

 

  1. public class CreatingThread07 {  
  2.     public static void main(String[] args) {  
  3.         List<integer> list = Arrays.asList(1, 2, 3, 4, 5);  
  4.         // 串行,打印結果為12345  
  5.         list.stream().forEach(System.out::print);  
  6.         System.out.println();  
  7.         // 并行,打印結果隨機,比如35214  
  8.         list.parallelStream().forEach(System.out::print);  
  9.     }  

使用并行計算的方式,可以提高程序運行的效率,多線程并行執行。

Spring異步方法

首先,springboot啟動類加上@EnableAsync注解(@EnableAsync是spring支持的,這里方便舉例使用springboot)。

 

  1. @SpringBootApplication  
  2. @EnableAsync  
  3. public class Application {  
  4.     public static void main(String[] args) {  
  5.         SpringApplication.run(Application.class, args);  
  6.     }  

其次,方法加上@Async注解。

 

  1. @Service  
  2. public class CreatingThread08Service {  
  3.     @Async  
  4.     public void call() {  
  5.         System.out.println(Thread.currentThread().getName() + " is running");  
  6.     }  

然后,測試用例直接跟使用一般的Service方法一模一樣。

 

  1. @RunWith(SpringRunner.class)  
  2. @SpringBootTest(classes = Application.class)  
  3. public class CreatingThread08Test {  
  4.     @Autowired  
  5.     private CreatingThread08Service creatingThread08Service;  
  6.     @Test  
  7.     public void test() {  
  8.         creatingThread08Service.call();  
  9.         creatingThread08Service.call();  
  10.         creatingThread08Service.call();  
  11.         creatingThread08Service.call();  
  12.     }  

運行結果如下:

 

  1. task-3 is running  
  2. task-2 is running  
  3. task-1 is running  
  4. task-4 is running 

可以看到每次執行方法時使用的線程都不一樣。

使用Spring異步方法的方式,可以說是相當地方便,適用于前后邏輯不相關聯的適合用異步調用的一些方法,比如發送短信的功能。

總結

(1)繼承Thread類并重寫run()方法;

(2)實現Runnable接口;

(3)匿名內部類;

(4)實現Callabe接口;

(5)定時器(java.util.Timer);

(6)線程池;

(7)并行計算(Java8+);

(8)Spring異步方法;

彩蛋

上面介紹了那么多創建線程的方式,其實本質上就兩種,一種是繼承Thread類并重寫其run()方法,一種是實現Runnable接口的run()方法,那么它們之間到底有什么聯系呢?

請看下面的例子,同時繼承Thread并實現Runnable接口,應該輸出什么呢?

 

  1. public class CreatingThread09 {  
  2.     public static void main(String[] args) {  
  3.         new Thread(()-&gt; {  
  4.             System.out.println("Runnable: " + Thread.currentThread().getName());  
  5.         }) {  
  6.             @Override  
  7.             public void run() {  
  8.                 System.out.println("Thread: " + getName());  
  9.             }  
  10.         }.start();  
  11.     }  

說到這里,我們有必要看一下Thread類的源碼:

 

  1. public class Thread implements Runnable {  
  2.     // Thread維護了一個Runnable的實例  
  3.     private Runnable target;     
  4.     public Thread() { 
  5.          init(null, null, "Thread-" + nextThreadNum(), 0);  
  6.     }    
  7.     public Thread(Runnable target) {  
  8.         init(null, target, "Thread-" + nextThreadNum(), 0);  
  9.     }    
  10.     private void init(ThreadGroup g, Runnable target, String name,  
  11.                       long stackSize, AccessControlContext acc,  
  12.                       boolean inheritThreadLocals) {  
  13.         // ...  
  14.         // 構造方法傳進來的Runnable會賦值給target  
  15.         this.target = target;  
  16.         // ...  
  17.     }    
  18.     @Override  
  19.     public void run() {  
  20.         // Thread默認的run()方法,如果target不為空,會執行target的run()方法  
  21.         if (target != null) {  
  22.             target.run();  
  23.         }  
  24.     }  

看到這里是不是豁然開朗呢?既然上面的例子同時繼承Thread并實現了Runnable接口,根據源碼,實際上相當于重寫了Thread的run()方法,在Thread的run()方法時實際上跟target都沒有關系了。

所以,上面的例子輸出結果為Thread: Thread-0,只輸出重寫Thread的run()方法中的內容。

 

 

責任編輯:龐桂玉 來源: 中國開源
相關推薦

2010-03-18 15:31:13

Java創建線程

2023-06-07 13:49:00

多線程編程C#

2018-04-02 14:29:18

Java多線程方式

2020-12-17 05:52:09

線程池ThreadPoolThreadPoolE

2024-11-04 09:39:08

Java?接口Thread?類

2024-02-26 08:28:24

Java線程CPU

2023-06-06 08:17:52

多線程編程Thread類

2017-04-17 19:31:03

Android多線程

2023-06-08 08:21:08

多線程編程線程間通信

2010-03-15 17:56:23

Java多線程

2022-11-02 15:00:03

Java值傳遞引用傳遞

2010-07-14 10:30:26

Perl多線程

2021-03-01 08:02:55

算法排序操作

2019-10-29 19:49:48

Java線程安全

2025-01-14 07:00:00

線程池ExecutorsJava

2011-06-24 11:03:31

Qt 多線程 線程

2011-06-24 11:12:39

Qt 多線程 線程

2023-06-09 07:59:37

多線程編程鎖機制

2024-02-05 12:08:07

線程方式管理

2009-03-12 10:52:43

Java線程多線程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91极品视频 | 欧美jizzhd精品欧美巨大免费 | 国产亚洲成av人在线观看导航 | 欧美日本久久 | 国产区在线观看 | 黄色一级特级片 | 欧美一区二区小视频 | 国产999精品久久久久久 | 亚欧午夜 | 亚洲欧美日本在线 | 成av在线| 日韩欧美在线播放 | 久久久久综合 | 亚洲精品大全 | 一区二区三区四区免费在线观看 | 一级一级毛片免费看 | 伊人网在线综合 | 久久久久欧美 | a国产视频| 欧美午夜一区 | 色播久久久| 97色在线视频 | 91精品国产91久久久久久 | 欧美综合一区 | 欧美激情va永久在线播放 | 精品久久久久久亚洲精品 | 国产精品国产a | 中文字幕在线二区 | 国产精品成人一区二区三区夜夜夜 | 亚洲区在线| 中文字幕欧美一区 | www.一区二区| 日日夜夜精品免费视频 | 国产成人精品一区二区 | 国产偷录视频叫床高潮对白 | 一区二区三区欧美在线观看 | 中文字幕在线欧美 | 日韩欧美在线视频 | 中文字幕高清在线 | 91精品久久久久久久久 | 中文字幕国产一区 |