日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
初學(xué)Java多線程:向線程傳遞數(shù)據(jù)的三種方法

在傳統(tǒng)的同步開發(fā)模式下,當(dāng)我們調(diào)用一個(gè)函數(shù)時(shí),通過這個(gè)函數(shù)的參數(shù)將數(shù)據(jù)傳入,并通過這個(gè)函數(shù)的返回值來返回最終的計(jì)算結(jié)果。但在多線程的異步開發(fā)模式下,數(shù)據(jù)的傳遞和返回和同步開發(fā)模式有很大的區(qū)別。由于線程的運(yùn)行和結(jié)束是不可預(yù)料的,因此,在傳遞和返回?cái)?shù)據(jù)時(shí)就無法象函數(shù)一樣通過函數(shù)參數(shù)和return語句來返回?cái)?shù)據(jù)。本文就以上原因介紹了幾種用于向線程傳遞數(shù)據(jù)的方法,在下一篇文章中將介紹從線程中返回?cái)?shù)據(jù)的方法。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),新寧企業(yè)網(wǎng)站建設(shè),新寧品牌網(wǎng)站建設(shè),網(wǎng)站定制,新寧網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,新寧網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

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

一、通過構(gòu)造方法傳遞數(shù)據(jù)

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

 
 
 
  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. }  

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

二、通過變量和方法傳遞數(shù)據(jù)

向?qū)ο笾袀魅霐?shù)據(jù)一般有兩次機(jī)會(huì),***次機(jī)會(huì)是在建立對象時(shí)通過構(gòu)造方法將數(shù)據(jù)傳入,另外一次機(jī)會(huì)就是在類中定義一系列的public的方法或變量(也可稱之為字段)。然后在建立完對象后,通過對象實(shí)例逐個(gè)賦值。下面的代碼是對MyThread1類的改版,使用了一個(gè)setName方法來設(shè)置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. }  

三、通過回調(diào)函數(shù)傳遞數(shù)據(jù)

上面討論的兩種向線程中傳遞數(shù)據(jù)的方法是最常用的。但這兩種方法都是main方法中主動(dòng)將數(shù)據(jù)傳入線程類的。這對于線程來說,是被動(dòng)接收這些數(shù)據(jù)的。然而,在有些應(yīng)用中需要在線程運(yùn)行的過程中動(dòng)態(tài)地獲取數(shù)據(jù),如在下面代碼的run方法中產(chǎn)生了3個(gè)隨機(jī)數(shù),然后通過Work類的process方法求這三個(gè)隨機(jī)數(shù)的和,并通過Data類的value將結(jié)果返回。從這個(gè)例子可以看出,在返回value之前,必須要得到三個(gè)隨機(jī)數(shù)。也就是說,這個(gè)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);   // 使用回調(diào)函數(shù)  
  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方法被稱為回調(diào)函數(shù)。從本質(zhì)上說,回調(diào)函數(shù)就是事件函數(shù)。在Windows API中常使用回調(diào)函數(shù)和調(diào)用API的程序之間進(jìn)行數(shù)據(jù)交互。因此,調(diào)用回調(diào)函數(shù)的過程就是最原始的引發(fā)事件的過程。在這個(gè)例子中調(diào)用了process方法來獲得數(shù)據(jù)也就相當(dāng)于在run方法中引發(fā)了一個(gè)事件。


網(wǎng)頁標(biāo)題:初學(xué)Java多線程:向線程傳遞數(shù)據(jù)的三種方法
文章位置:http://www.5511xx.com/article/dhcehgg.html