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

初學Java多線程:從線程返回數據的兩種方法

開發 后端
本文介紹學習Java多線程中需要學習的從線程返回數據的兩種方法。從線程中返回數據和向線程傳遞數據類似。也可以通過類成員以及回調函數來返回數據。

從線程中返回數據和向線程傳遞數據類似。也可以通過類成員以及回調函數來返回數據。但類成員在返回數據和傳遞數據時有一些區別,下面讓我們來看看它們區別在哪。

一、通過類變量和方法返回數據

使用這種方法返回數據需要在調用start方法后才能通過類變量或方法得到數據。讓我們先來看看例程2-13會得到什么結果。

  1. package mythread;  
  2.  
  3. public class MyThread extends Thread  
  4. {  
  5.     private String value1;  
  6.     private String value2;  
  7.  
  8.     public void run()  
  9.     {  
  10.         value1 = "通過成員變量返回數據";  
  11.         value2 = "通過成員方法返回數據";  
  12.     }  
  13.     public static void main(String[] args) throws Exception  
  14.     {  
  15.         MyThread thread = new MyThread();  
  16.         thread.start();  
  17.         System.out.println("value1:" + thread.value1);  
  18.         System.out.println("value2:" + thread.value2);  
  19.     }  
  20. }  

運行上面的代碼有可能輸出如下的結果:

value1:null
value2:null

從上面的運行結果看很不正常。在run方法中已經對value1和value2賦了值,而返回的卻是null。發生這種情況的原因是調用start方法后就立刻輸出了value1和value2的值,而這里run方法還沒有執行到為value1和value2賦值的語句。要避免這種情況的發生,就需要等run方法執行完后才執行輸出value1和value2的代碼。因此,我們可以想到使用sleep方法將主線程進行延遲,如可以在thread.start()后加一行如下的語句:

sleep(1000);

這樣做可以使主線程延遲1秒后再往下執行,但這樣做有一個問題,就是我們怎么知道要延遲多長時間。在這個例子的run方法中只有兩條賦值語句,而且只創建了一個線程,因此,延遲1秒已經足夠,但如果run方法中的語句很復雜,這個時間就很難預測,因此,這種方法并不穩定。

我們的目的就是得到value1和value2的值,因此,只要判斷value1和value2是否為null。如果它們都不為null時,就可以輸出這兩個值了。我們可以使用如下的代碼來達到這個目的:

  1. while (thread.value1 == null || thread.value2 == null); 

使用上面的語句可以很穩定地避免這種情況發生,但這種方法太耗費系統資源。大家可以設想,如果run方法中的代碼很復雜,value1和value2需要很長時間才能被賦值,這樣while循環就必須一直執行下去,直到value1和value2都不為空為止。因此,我們可以對上面的語句做如下的改進:

  1. while (thread.value1 == null || thread.value2 == null)  
  2.     sleep(100); 

在while循環中第判斷一次value1和value2的值后休眠100毫秒,然后再判斷這兩個值。這樣所占用的系統資源會小一些。

上面的方法雖然可以很好地解決,但Java的線程模型為我們提供了更好的解決方案,這就是join方法。在前面已經討論過,join的功能就是使用線程從異步執行變成同步執行。當線程變成同步執行后,就和從普通的方法中得到返回數據沒有什么區別了。因此,可以使用如下的代碼更有效地解決這個問題:

thread.start();
thread.join();

在thread.join()執行完后,線程thread的run方法已經退出了,也就是說線程thread已經結束了。因此,在thread.join()后面可以放心大膽地使用MyThread類的任何資源來得到返回數據。

二、通過回調函數返回數據

其實這種方法已經在《向線程傳遞數據的三種方法》中介紹了。在《向線程傳遞數據的三種方法》一文的例子中通過Work類的process方法向線程中傳遞了計算結果,但同時,也通過process方法從線程中得到了三個隨機數。因此,這種方法既可以向線程中傳遞數據,也可以從線程中獲得數據。

【編輯推薦】

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

2009-06-29 18:18:53

Java多線程向線程傳遞數據

2009-06-29 17:49:47

Java多線程

2009-06-29 18:08:51

Java多線程join方法

2009-08-28 16:16:02

線程運行狀態

2009-06-29 18:03:15

Java多線程線程的生命周期

2015-09-10 09:30:54

Java多線程同步

2009-06-29 18:32:52

Java多線程Synchronize

2009-06-29 18:00:05

Java多線程Runnable接口創建線程

2009-06-29 17:54:10

Java多線程Thread類創建線程

2010-07-14 10:30:26

Perl多線程

2022-07-07 00:33:34

Java線程同步

2009-06-29 18:26:11

Java多線程Synchronize同步類

2010-08-04 17:41:52

掛載NFS

2009-11-13 15:46:25

Java多線程

2021-06-01 21:24:44

多線程代碼搜索

2009-06-29 18:44:28

Java多線程Synchronize同步變量

2011-07-01 17:50:13

Python 多線程

2009-03-12 10:52:43

Java線程多線程

2009-09-25 14:04:09

Hibernate eHibernate h

2010-04-13 09:50:44

Oracle跟蹤
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99久久免费观看 | 亚洲一区二区视频 | 黄色毛片免费看 | 国产美女永久免费无遮挡 | 资源首页二三区 | 精品国产乱码久久久久久丨区2区 | 黑人精品 | 在线观看中文字幕 | 久久精品视频在线免费观看 | 欧美日韩视频在线第一区 | 亚洲一区二区免费电影 | 久久久久久久久久久久久久久久久久久久 | 在线视频91| 久久亚洲一区二区 | 91热在线 | 国产综合区| 久久国产精品视频 | 一级一级毛片免费看 | 成人免费网站 | 玖玖久久 | 在线观看国产 | 国产精品自产av一区二区三区 | 久久里面有精品 | 一区二区久久 | 国产一区 | 国产一区二区 | 亚洲成人www | 黄色日本片| 欧美日韩在线免费观看 | 97视频在线观看网站 | 99视频入口 | 欧美大片在线观看 | 日韩黄a| www.久草.com | 精品久久久久一区二区国产 | 免费看国产a| 久久久国产一区二区 | 综合色播 | 久久不卡 | a级片www| 日韩欧美一区二区三区免费观看 |