2013-08-23 37 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的异步执行完成并检索其结果。