java多線程編程之從線程前往數據的兩種辦法。本站提示廣大學習愛好者:(java多線程編程之從線程前往數據的兩種辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是java多線程編程之從線程前往數據的兩種辦法正文
1、經由過程類變量和辦法前往數據
應用這類辦法前往數據須要在挪用start辦法後能力經由過程類變量或辦法獲得數據。讓我們先來看看例程2-13會獲得甚麼成果。
package mythread;
public class MyThread extends Thread
{
private String value1;
private String value2;
public void run()
{
value1 = "經由過程成員變量前往數據";
value2 = "經由過程成員辦法前往數據";
}
public static void main(String[] args) throws Exception
{
MyThread thread = new MyThread();
thread.start();
System.out.println("value1:" + thread.value1);
System.out.println("value2:" + thread.value2);
}
}
運轉下面的代碼有能夠輸入以下的成果:
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時,便可以輸入這兩個值了。我們可使用以下的代碼來到達這個目標:
while (thread.value1 == null || thread.value2 == null);
應用下面的語句可以很穩固地防止這類情形產生,但這類辦法太消耗體系資本。年夜家可以假想,假如run辦法中的代碼很龐雜,value1和value2須要很長時光能力被賦值,如許while輪回就必需一向履行下去,直到value1和value2都不為空為止。是以,我們可以對下面的語句做以下的改良:
while (thread.value1 == null || thread.value2 == null)
sleep(100);
在while輪回中第斷定一次value1和value2的值後休眠100毫秒,然後再斷定這兩個值。如許所占用的體系資本會小一些。
下面的辦法固然可以很好地處理,但Java的線程模子為我們供給了更好的處理計劃,這就是join辦法。在後面曾經評論辯論過,join的功效就是應用線程從異步履行釀成同步履行。當線程釀成同步履行後,就和從通俗的辦法中獲得前往數據沒有甚麼差別了。是以,可使用以下的代碼更有用地處理這個成績:
thread.start();
thread.join();
在thread.join()履行完後,線程thread的run辦法曾經加入了,也就是說線程thread曾經停止了。是以,在thread.join()前面可以寧神年夜膽地應用MyThread類的任何資本來獲得前往數據。
2、經由過程回調函數前往數據
其實這類辦法曾經在《向線程傳遞數據的三種辦法》中引見了。在《向線程傳遞數據的三種辦法》一文的例子中經由過程Work類的process辦法向線程中傳遞了盤算成果,但同時,也經由過程process辦法從線程中獲得了三個隨機數。是以,這類辦法既可以向線程中傳遞數據,也能夠從線程中取得數據。