需要帮助在线程运行方法中返回对象
我有一个扩展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()
方法来返回ByteArrayOutputStream
或String
。 但是,因为它位于Thread
的run()
方法中,所以我无法将方法的返回类型设置为ByteArrayOutputStream
或String
。
HttpRequestDispatcher
类在名为OAuth.java的类中调用。
我怎样才能解决这种情况?
这个问题有几种解决方案:
-
使用Thread外部的数据结构。 传递构造函数中的对象并在线程即将完成时更新它。
-
使用回调方法。 线程完成后,调用回调。
-
使用
java.util.concurrent.Future
(Java> = 1.5):Future表示异步计算的结果。 提供方法以检查计算是否完成,等待其完成,以及检索计算结果。
让它实现Callable
而不是Thread
或Runnable
。 这里T
必须代表结果的类型。 使用ExecutorService
执行它。 它将返回Future
。
这是一个SSCCE , String
为T
,只是复制’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"; } }