在编程中,根据实际场景,我们有时会考虑使用异步执行来提高应用的响应速度;一个简单的例子:
@Test
public void futureTest() {
// 注意使用 ExecutorService 而非 Executor
ExecutorService executorService = Executors.newFixedThreadPool(1);
Future future = executorService.submit(() -> {
//此处为Callable接口实现
// 业务代码
System.out.println("执行异步任务...");
return "返回执行结果";
});
try {
//判断异步线程是否执行完成
if (future.isDone())
System.out.println("线程执行完成1");
//获取异步线程的执行结果,若未完成将阻塞
String result = future.get();
System.out.println(result);
if (future.isDone())
System.out.println("线程执行完成2");
} catch (Exception e) {
}
}
执行结果:
执行异步任务...
返回执行结果
线程执行完成2
一.Runnable与Callable接口
多线程执行的任务,常用的Runnable接口来编写多线程任务,而对于某些计算类任务需要得到计算结果则有Callable接口;Runnable实现可以通过Thread类执行或调用线程池execute方法执行,而Callable实现只能通过线程池的submit方法执行,下面是例子:
@Test
public void currentTest() {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("执行任务1...");
}
};
//泛型代表了任务执行的返回类型
Callable callable = new Callable() {
@Override
public String call() throws Exception {
System.out.println("执行计算任务2...");
return "任务2结果";
}
};
ExecutorService service = Executors.newFixedThreadPool(2);
//Runnable任务使用execute方法
service