我有一个扩展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
。但是,因为它位于run()
的{{1}}方法中,所以我无法将方法的返回类型设置为Thread
或ByteArrayOutputStream
。
String
类在名为OAuth.java的类中调用。
我如何解决这种情况?
答案 0 :(得分:9)
这个问题有几种解决方案:
使用Thread外部的数据结构。传递构造函数中的对象并在线程即将完成时更新它。
使用回调方法。线程完成后,请调用回调。
使用java.util.concurrent.Future
(Java> = 1.5):
Future表示异步计算的结果。提供方法以检查计算是否完成,等待其完成,以及检索计算结果。
答案 1 :(得分:7)
让它实现Callable<T>
而不是Thread
或Runnable
。此处T
必须表示结果的类型。使用ExecutorService
执行它。它将返回Future<V>
的味道结果。
这是一个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<String> future = executor.submit(new Task());
System.out.println(future.get()); // Prints "result" after 2 secs.
// Or if you have multiple tasks.
// List<Future<String>> futures = executor.invokeAll(Arrays.asList(new Task()));
// for (Future<String> future : futures) {
// System.out.println(future.get());
// }
executor.shutdown(); // Important!
}
}
class Task implements Callable<String> {
public String call() throws Exception {
Thread.sleep(2000);
return "result";
}
}