2011-10-10 57 views
12

如何將StatusCallMe()一起使用isFinish()返回值爲true?如何從Java的內部線程Runnable方法獲取返回值?

public static boolean isFinish() 
{  
    boolean Status = false; 
    new Thread(new Runnable() 
    { 
    public void run() 
    { 
     /* This shell return true or false 
     * How do you keep it in Status 
     */ 
     CallMe(); 
    } 
    }).start(); 

    /* How can i get the true or false exactly from CallMe? here */ 
    return Status; 
} 

public static boolean CallMe() 
{ 
    /* some heavy loads ... */ 
    return true; 
} 
+3

爲什麼使用線程? start()將創建一個單獨的執行線程,此時isFinish將繼續執行。 –

回答

27

有兩種方法可以做到這一點。 首先是使用未來的計算結果,另一個是有共享變量。 我認爲第一種方法比第二種方法清潔得多,但有時您需要將值也推送到線程中。

  • 使用RunnableFuture

FutureTask實現了RunnableFuture。所以你創建了這個任務,一旦執行,就會有價值。

RunnableFuture f = new FutureTask(new Callable<Boolean>() { 
    // implement call 
}); 
// start the thread to execute it (you may also use an Executor) 
new Thread(f).start(); 
// get the result 
f.get(); 
  • 使用holder類

你創建一個類持有價值,分享到類的引用。你可以創建自己的班級,或者簡單地使用AtomicReference。 持有者類,我的意思是一個具有公共可修改屬性的類。

// create the shared variable 
final AtomicBoolean b = new AtomicBoolean(); 
// create your thread 
Thread t = new Thread(new Runnable() { 
    public void run() { 
    // you can use b in here 
    } 
}); 
t.start(); 
// wait for the thread 
t.join(); 
b.get(); 
+0

+1,好的回答 –

+0

+1,好像兩種方法,真的很感謝。我需要全雙工都給我最好的方向。 – YumYumYum

+0

謝謝!我需要這個爲我的大學項目,你幫了很多。 –

3

您重寫使用Callable<Boolean>的代碼,並獲得Future啓動Runnable時。

期貨允許啓動線程正確檢查該值是否準備就緒,並可以異步讀取。你可以手工編寫代碼,但由於Future現在是標準JVM庫的一部分,你爲什麼會(在編程類之外)呢?

1

使用原始線程,您可以使用指定類型實現Runnable,並將值存儲在其中。

class MyRunnable implements Runnable { 
    boolean status; 

    public void run() { 
     ... 
    } 
} 

但是,如果您使用另一個線程,則必須以某種方式進行同步。

使用java.util.concurrent層次結構提供的更高級工具會更容易。你可以將一個Callable提交給Executor,並獲得一個Future。你可以詢問未來是否完成,並獲得結果。有一個Oracle tutorial here