FutureTask:
FutureTask其实相当于是对Callable和Runnable的整合
在实际开发过程中,将那些耗时较长,且可以并行的操作都封装成一个FutureTask。
package com.zr.concurrency.test.others;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.*;
/**
* @description: JUC中FutureTask的使用
* FutureTask:
* FutureTask其实相当于是对Callable和Runnable的整合
* 在实际开发过程中,将那些耗时较长,且可以并行的操作都封装成一个FutureTask。
* @author: liangrui
* @create: 2020-01-03 16:18
**/
@Slf4j
public class FutureTaskExample {
public static void main(String[] args) throws InterruptedException, ExecutionException {
//创建FutureTask类
//使用Callable,既可以抛异常,又有返回值
FutureTask<String> futureTask1=new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
//callable执行任务
log.info("do something in callable");
Thread.sleep(5000);
//执行成功返回"Done"
return "Done";
}
});
//创建FutureTask类
//使用Runnable,返回值需要写为第二个参数result,不能抛异常
FutureTask<String> futureTask2=new FutureTask<>(new Runnable(){
@Override
public void run() {
//runnable执行任务
log.info("do something in runnable");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"Done");//执行成功返回result:"Done"
//创建线程池
ExecutorService executorService=Executors.newCachedThreadPool();
executorService.submit(futureTask1);
executorService.submit(futureTask2);
//关闭线程池,释放资源
executorService.shutdown();
//main线程执行任务时间
Thread.sleep(1000);
log.info("main finished,waiting...............");
//获取各线程执行成功的返回值
String result1=futureTask1.get();
String result2=futureTask2.get();
//输出
log.info("result1:{}",result1);
log.info("result2:{}",result2);
}
}
运行结果:
16:41:29.778 [Thread-0] INFO com.zr.concurrency.test.others.FutureTaskExample - do something in callable
16:41:29.778 [Thread-1] INFO com.zr.concurrency.test.others.FutureTaskExample - do something in runnable
16:41:30.775 [main] INFO com.zr.concurrency.test.others.FutureTaskExample - main finished,waiting...............
16:41:34.784 [main] INFO com.zr.concurrency.test.others.FutureTaskExample - result1:Done
16:41:34.788 [main] INFO com.zr.concurrency.test.others.FutureTaskExample - result2:Done