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

初學Java多線程:向線程傳遞數據的三種方法

開發 后端
本文講述在學習Java多線程中需要學習的向線程傳遞數據的三種方法。由于線程的運行和結束是不可預料的,因此,在傳遞和返回數據時就無法象函數一樣通過函數參數和return語句來返回數據。

在傳統的同步開發模式下,當我們調用一個函數時,通過這個函數的參數將數據傳入,并通過這個函數的返回值來返回最終的計算結果。但在多線程的異步開發模式下,數據的傳遞和返回和同步開發模式有很大的區別。由于線程的運行和結束是不可預料的,因此,在傳遞和返回數據時就無法象函數一樣通過函數參數和return語句來返回數據。本文就以上原因介紹了幾種用于向線程傳遞數據的方法,在下一篇文章中將介紹從線程中返回數據的方法。

欲先取之,必先予之。一般在使用線程時都需要有一些初始化數據,然后線程利用這些數據進行加工處理,并返回結果。在這個過程中***要做的就是向線程中傳遞數據。

一、通過構造方法傳遞數據

在創建線程時,必須要建立一個Thread類的或其子類的實例。因此,我們不難想到在調用start方法之前通過線程類的構造方法將數據傳入線程。并將傳入的數據使用類變量保存起來,以便線程使用(其實就是在run方法中使用)。下面的代碼演示了如何通過構造方法來傳遞數據:

  1. package mythread;  
  2.  
  3. public class MyThread1 extends Thread  
  4. {  
  5.     private String name;  
  6.  
  7.     public MyThread1(String name)  
  8.     {  
  9.         this.name = name;  
  10.     }  
  11.     public void run()  
  12.     {  
  13.         System.out.println("hello " + name);  
  14.     }  
  15.     public static void main(String[] args)  
  16.     {  
  17.         Thread thread = new MyThread1("world");  
  18.         thread.start();          
  19.     }  
  20. }  

由于這種方法是在創建線程對象的同時傳遞數據的,因此,在線程運行之前這些數據就就已經到位了,這樣就不會造成數據在線程運行后才傳入的現象。如果要傳遞更復雜的數據,可以使用集合、類等數據結構。使用構造方法來傳遞數據雖然比較安全,但如果要傳遞的數據比較多時,就會造成很多不便。由于Java沒有默認參數,要想實現類似默認參數的效果,就得使用重載,這樣不但使構造方法本身過于復雜,又會使構造方法在數量上大增。因此,要想避免這種情況,就得通過類方法或類變量來傳遞數據。

二、通過變量和方法傳遞數據

向對象中傳入數據一般有兩次機會,***次機會是在建立對象時通過構造方法將數據傳入,另外一次機會就是在類中定義一系列的public的方法或變量(也可稱之為字段)。然后在建立完對象后,通過對象實例逐個賦值。下面的代碼是對MyThread1類的改版,使用了一個setName方法來設置name變量:

  1. package mythread;  
  2.  
  3. public class MyThread2 implements Runnable  
  4. {  
  5.     private String name;  
  6.  
  7.     public void setName(String name)  
  8.     {  
  9.         this.name = name;  
  10.     }  
  11.     public void run()  
  12.     {  
  13.         System.out.println("hello " + name);  
  14.     }  
  15.     public static void main(String[] args)  
  16.     {  
  17.         MyThread2 myThread = new MyThread2();  
  18.         myThread.setName("world");  
  19.         Thread thread = new Thread(myThread);  
  20.         thread.start();  
  21.     }  
  22. }  

三、通過回調函數傳遞數據

上面討論的兩種向線程中傳遞數據的方法是最常用的。但這兩種方法都是main方法中主動將數據傳入線程類的。這對于線程來說,是被動接收這些數據的。然而,在有些應用中需要在線程運行的過程中動態地獲取數據,如在下面代碼的run方法中產生了3個隨機數,然后通過Work類的process方法求這三個隨機數的和,并通過Data類的value將結果返回。從這個例子可以看出,在返回value之前,必須要得到三個隨機數。也就是說,這個value是無法事先就傳入線程類的。

  1. package mythread;  
  2.  
  3. class Data  
  4. {  
  5.     public int value = 0;  
  6. }  
  7. class Work  
  8. {  
  9.     public void process(Data data, Integer numbers)  
  10.     {  
  11.         for (int n : numbers)  
  12.         {  
  13.             data.value += n;  
  14.         }  
  15.     }  
  16. }  
  17. public class MyThread3 extends Thread  
  18. {  
  19.     private Work work;  
  20.  
  21.     public MyThread3(Work work)  
  22.     {  
  23.         this.work = work;  
  24.     }  
  25.     public void run()  
  26.     {  
  27.         java.util.Random random = new java.util.Random();  
  28.         Data data = new Data();  
  29.         int n1 = random.nextInt(1000);  
  30.         int n2 = random.nextInt(2000);  
  31.         int n3 = random.nextInt(3000);  
  32.         work.process(data, n1, n2, n3);   // 使用回調函數  
  33.         System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+" 
  34.                 + String.valueOf(n3) + "=" + data.value);  
  35.     }  
  36.     public static void main(String[] args)  
  37.     {  
  38.         Thread thread = new MyThread3(new Work());  
  39.         thread.start();  
  40.     }  
  41. }  

在上面代碼中的process方法被稱為回調函數。從本質上說,回調函數就是事件函數。在Windows API中常使用回調函數和調用API的程序之間進行數據交互。因此,調用回調函數的過程就是最原始的引發事件的過程。在這個例子中調用了process方法來獲得數據也就相當于在run方法中引發了一個事件。

【編輯推薦】

  1. 初學Java多線程:慎重使用volatile關鍵字
  2. 初學Java多線程:join方法的使用
  3. 初學Java多線程:線程的生命周期
  4. 初學Java多線程:使用Runnable接口創建線程
  5. 初學Java多線程:用Thread類創建線程
責任編輯:yangsai 來源: 真的有外星人嗎
相關推薦

2022-07-07 00:33:34

Java線程同步

2009-06-29 18:22:54

Java多線程從線程返回數據

2018-04-02 14:29:18

Java多線程方式

2023-08-03 16:02:24

Objectwaitnotify

2015-09-10 09:30:54

Java多線程同步

2024-08-28 11:10:53

2025-04-02 07:22:19

2009-06-29 17:49:47

Java多線程

2009-06-29 18:08:51

Java多線程join方法

2023-05-16 16:07:07

大數據數據管理工具

2021-10-09 06:59:36

技術MyBatis數據

2010-10-20 13:52:07

SQL Server數

2009-07-08 12:56:32

編寫Servlet

2009-06-29 18:03:15

Java多線程線程的生命周期

2009-07-16 16:23:59

Swing線程

2021-12-20 07:11:26

Java List排序 Java 基礎

2009-06-29 18:32:52

Java多線程Synchronize

2009-06-29 18:00:05

Java多線程Runnable接口創建線程

2010-11-19 14:51:09

Oracle數據庫關閉

2023-02-24 16:45:02

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人免费视频网站在线看 | 久久艹免费视频 | 91亚洲免费 | 成人免费淫片aa视频免费 | a久久 | 国产成人99久久亚洲综合精品 | 欧美久久久久久久久中文字幕 | 日韩精品色网 | av网站在线看 | 国产精品免费小视频 | 91久久精品国产免费一区 | 精品久久久久久亚洲精品 | 成av在线 | 午夜免费网 | 国产精品二区三区 | 国产一区二区三区久久久久久久久 | 中文字幕在线精品 | www.99热| 美女日皮网站 | 欧美v片| 男女网站免费观看 | 亚洲视频中文字幕 | 精品国产一区二区三区久久久久久 | 一区二区三区免费 | 一区二区视频在线 | 成人免费在线观看 | 在线观看涩涩视频 | 三区四区在线观看 | 天堂久久天堂综合色 | 国产999精品久久久 午夜天堂精品久久久久 | 精品久久网 | 五月网婷婷 | 91色综合 | 欧美日韩在线免费观看 | 免费观看一级特黄欧美大片 | 成人影视网址 | 男人天堂久久久 | 国产99视频精品免视看9 | 毛片网络| 久久久精品一区二区三区 | 一级毛片视频在线 |