lit*_*leK 9 java methods multithreading return
我有一个扩展的Java类Thread,它基本上如下所示:
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 Code Online (Sandbox Code Playgroud)
我需要run()方法来返回a ByteArrayOutputStream或a String.但是,因为它是在run()方法中Thread,我不能将方法的返回类型设置为a ByteArrayOutputStream或a String.
该HttpRequestDispatcher班被称为所谓的OAuth.java类里面.
我怎样才能解决这种情况?
这个问题有几种解决方案:
使用Thread外部的数据结构.传递构造函数中的对象并在线程即将完成时更新它.
使用回调方法.线程完成后,调用回调.
使用java.util.concurrent.Future(Java> = 1.5):
Future表示异步计算的结果.提供方法以检查计算是否完成,等待其完成,以及检索计算结果.
让它实现Callable<T>而不是Thread或Runnable.这里T必须代表结果的类型.使用ExecutorService来执行它.它将返回结果的味道Future<V>.
这是一个带有as 的SSCCE,只是copy'n'paste'n'run它.StringT
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";
}
}
Run Code Online (Sandbox Code Playgroud)