需要帮助在线程运行方法中返回对象

我有一个扩展Thread的Java类,它基本上如下所示:

 public class HttpRequestDispatcher extends Thread { private String url; private String method; // GET or POST private byte[] postData; public HttpRequestDispatcher(String url, String method, byte[] postData) { this.url = url; this.method = method; this.postData = postData; } public HttpRequestDispatcher(String url, String method) { this.url = url; this.method = method; } public void run() { ... } } 

我需要run()方法来返回ByteArrayOutputStreamString 。 但是,因为它位于Threadrun()方法中,所以我无法将方法的返回类型设置为ByteArrayOutputStreamString

HttpRequestDispatcher类在名为OAuth.java的类中调用。

我怎样才能解决这种情况?

这个问题有几种解决方案:

  • 使用Thread外部的数据结构。 传递构造函数中的对象并在线程即将完成时更新它。

  • 使用回调方法。 线程完成后,调用回调。

  • 使用java.util.concurrent.Future (Java> = 1.5):

    Future表示异步计算的结果。 提供方法以检查计算是否完成,等待其完成,以及检索计算结果。

让它实现Callable而不是ThreadRunnable 。 这里T必须代表结果的类型。 使用ExecutorService执行它。 它将返回Future

这是一个SSCCE , StringT ,只是复制’n’paste’n’run它。

 package com.stackoverflow.q2300433; import java.util.Arrays; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class Test { public static void main(String... args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Future future = executor.submit(new Task()); System.out.println(future.get()); // Prints "result" after 2 secs. // Or if you have multiple tasks. // List> futures = executor.invokeAll(Arrays.asList(new Task())); // for (Future future : futures) { // System.out.println(future.get()); // } executor.shutdown(); // Important! } } class Task implements Callable { public String call() throws Exception { Thread.sleep(2000); return "result"; } }