2013-08-23 78 views
0

我有Web服務和Web服務調用由Thread處理,以便它們可以異步運行並超時。但是線程是「可運行的」而不是「可調用的」,所以線程無法傳回Web服務響應。使線程返回java中的值

我已閱讀聲明,我們需要使用callable.Is他們的任何方式來返回從我的可運行線程的響應。我發佈一個小例子,我們可以讓它返回值。

public class HelloThread extends Thread { 

    public void run() { 
     System.out.println("Hello from a thread!"); 
     String a="Hello"; 
    } 

    public static void main(String args[]) { 
     (new HelloThread()).start(); 
    } 

} 
+1

由於線程是異步運行的,所以沒有機會從一個線程返回值到另一個線程。因此,如果他們在一次課程中,您可以考慮採用一個全局變量,但這對於線程並行運行時的某些情況也無效。 –

+1

您應該查看[Future](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html)界面 – MadProgrammer

回答

4

你應該傳遞一個回調到Thread和線程可以與值調用回調的完成時。

+0

如何將回調傳遞給線程 – user2354846

+1

將回調作爲線程的構造函數中的對象傳遞並將其作爲線程實例的實例變量存儲(當然,您必須在線程實現中實現構造函數)。 – Matthias

0

您不能從線程返回值。但您可能有興趣查看和使用SwingWorker。它使您能夠在後臺運行一些工作,並在完成使用doneget方法後返回某些內容。

Here it is in more details

另一種方法是在線程開始運行和一些值分配給它的線程的方法run內之前定義的變量。這樣,當線程完成後,您將能夠使用該變量。 再次你必須處理所有那些concurrencylocks和其他的東西。

2

而不是使用明確的線程,您可以使用ExecutorService接口。

您可以使用Executors類實例化它,然後調用submit並將Callable傳遞給它。這將開始在另一個線程中運行Callable中的代碼,並立即返回Future對象。

然後,您可以撥打Future上的get以等待Callable的異步執行完成並檢索其結果。