程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java多線程編程之從線程前往數據的兩種辦法

java多線程編程之從線程前往數據的兩種辦法

編輯:關於JAVA

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辦法從線程中獲得了三個隨機數。是以,這類辦法既可以向線程中傳遞數據,也能夠從線程中取得數據。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved