【问题标题】:Make thread to return value in java [duplicate]使线程在java中返回值[重复]
【发布时间】:2013-08-23 06:15:47
【问题描述】:

我有网络服务,网络服务调用由线程处理,因此它们可以异步运行,也可以超时。但是线程是“可运行的”而不是“可调用的”,因此线程无法传回 Web 服务响应。

我已经阅读了我们需要使用可调用的声明。他们有什么方法可以从我的可运行线程返回响应。我发布了一个小例子,我们可以让它返回值吗?

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();
    }

}

【问题讨论】:

  • 由于线程异步运行,没有机会从一个线程返回值到另一个线程。因此,如果它们在一个类中,您可以考虑采用一个全局变量,但这在某些情况下也无效,因为线程并行运行。
  • 你应该看看Future界面

标签: java multithreading


【解决方案1】:

您应该将回调传递给Thread,并且线程可以在完成后使用该值调用回调。

【讨论】:

  • 如何将回调传递给线程
  • 在线程的构造函数中将回调作为对象传递,并将其存储为线程实例的实例变量(当然您必须在线程实现中实现构造函数)。
【解决方案2】:

您可以使用ExecutorService 接口,而不是使用显式线程。

您可以使用Executors 类对其进行实例化,然后调用submit 并将Callable 传递给它。这将开始在另一个线程中运行Callable 中的代码,并立即返回一个Future 对象。

然后您可以在Future 上调用get 以等待Callable 的异步执行完成并检索其结果。

【讨论】:

    【解决方案3】:

    您不能从线程返回值。但您可能有兴趣查看和使用SwingWorker。它使您可以在后台运行一些工作,并在完成后使用其doneget 方法返回一些内容。

    Here it is in more details

    另一种方法是在线程开始运行之前定义一个变量,并在线程的run 方法中为其分配一些值。这样,您将能够在线程完成时使用该变量。 但是你必须再次处理所有这些concurrencylocks 和其他东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      相关资源
      最近更新 更多