概述
很多场景下,我们需要线程的返回值来进行下一步操作,那么究竟怎么来获取么?
在这里,提供了集中常用的方式以供参考。
获取值的多种方式
传递入参、出参
public class MyRunable implements Runnable {
private String param;
@Getter
private String result;
public MyRunable(String param) {
this.param = param;
}
@Override
public void run() {
result = this.param + " success";
}
public static void main(String[] args) {
MyRunable myRunable = new MyRunable("jszhao");
Thread a = new Thread(myRunable);
a.start();
while (a.isAlive()) ;
System.out.println(myRunable.getResult()); // "jszhao success"
}
}
入参出参齐活了…
利用线程池获取返回值
/**
* 通过线程池获取线程的返回值
*/
public class GetValueByExecutor {
public static void main(String[] args) {
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(20);
Callable<String> callable = () -> {
return "success";
};
Future<String> submit = executor.submit(callable);
try {
String s = submit.get(1, TimeUnit.SECONDS);
System.out.println(s);// "success"
} catch (Exception e) {
e.printStackTrace();
}
}
}
Future和Callable的差异
UML图
由图可以看到,Runable接口中run方法时线程执行的方法主体;Future接口主要定义了对线程状态的一些方法(如取消线程执行、获取方法返回值等),而callable方法主要是回调。