并发编程返回结果的讨论
在并发编程中,我们往往需要获取一个线程的执行结果,并处理它。
对于这个问题,在java中我们可以通过下面两种方式来实现:
1、回调接口:首先我们需要定义一个回调接口,用来在线程结束的
时候调用并处理一些东西;这种方式相对于主线程来说是异步的,主线程
并不能得到子线程的执行结果,一切都托付给了回调接口处理。
2、使用Future同步等待执行结果:我们可以通过Future在主线程中
得到子线程的返回数据,然后处理;这种方式相对于主线程来说是同步
的。
下面我们将介绍上面两种关于处理子线程返回结果的方法。
接口回调
1、定义回调接口;
2、实现回调接口:回调接口主要用于处理线程执行完成的结果。
3、创建子线程执行类;
4、测试;
package com.java.thread.demo002;
public class Demo002_a {
public static void main(String[] args) {
//在主线程中初始化回调函数
TaskCallable taskCallable = new TaskHandler();
TaskExecutor executor = new TaskExecutor(taskCallable, "测试回调任务");
new Thread(executor).start();
}
}
//定义回调接口
interface TaskCallable<T>{
T callable(T t);
}
//回调函数实现类
//我们假定子线程的执行结果为String类型
class TaskHandler implements TaskCallable<String>{
@Override
public String callable(String s) {
// 结果处理中...
System.out.println(s + " 结果处理中...");
return s + " 结果处理完成";
}
}
//创建任务的执行类
class TaskExecutor implements Runnable{
private TaskCallable<String> taskCallable;
private String taskParamer;
public TaskExecutor(TaskCallable<String> taskCallable,String taskParamer){
this.taskCallable = taskCallable;
this.taskParamer = taskParamer;
}
@Override
public void run() {
//相关任务处理中....
taskCallable.callable(taskParamer);
}
}
Future同步等待执行结果
在JDK中提供了可以直接返回异步执行结果的处理方案,Future + Callable
代码如下:
package com.java.thread.demo002;
import java.util.concurrent.*;
public class Demo002_b {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//定义线程池
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return "测试Future获取异步结果...";
}
});
//相对于主线程同步,必须等待主线程执行完成
System.out.println(future.get());
executor.shutdown();
}
}
参考文档
<<深入理解高并发编程>>
<<java编程思想>>