package test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
public class Test{
public static void main(String[] args) throws InterruptedException, ExecutionException {
long start=System.nanoTime();
List<String> allData = new ArrayList<>();
//创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
ExecutorService executor = Executors.newCachedThreadPool();
//当计数器的值为0时,表示所有线程都执行完毕
CountDownLatch countDownLatch = new CountDownLatch(3);
//一个可取消的异步计算
FutureTask<List<String>> task1 = new FutureTask<>(new Callable1(countDownLatch));
FutureTask<List<String>> task2 = new FutureTask<>(new Callable2(countDownLatch));
FutureTask<List<String>> task3 = new FutureTask<>(new Callable3(countDownLatch));
//执行任务
executor.execute(task1);
executor.execute(task2);
executor.execute(task3);
//主线程阻塞,等待所有子线程执行完成
countDownLatch.await();
//关闭线程池
executor.shutdown();
allData.addAll(task1.get());
allData.addAll(task2.get());
allData.addAll(task3.get());
System.out.println(allData);
long tycEnd=System.nanoTime();
double tycTime=(tycEnd-start)/1000000000;
System.out.println("项目耗时:"+tycTime+"s");
Thread.sleep(3000000);
}
}
class Callable1 implements Callable<List<String>> {
private CountDownLatch downLatch;
public Callable1(CountDownLatch downLatch){
this.downLatch = downLatch;
}
@Override
public List<String> call() throws Exception {
List<String> list = new ArrayList<>();
System.out.println("开始1");
//Thread.sleep(3000);
list.add("1");
list.add("3");
//计数器减1
downLatch.countDown();
System.out.println("结束1");
return list;
}
}
class Callable2 implements Callable<List<String>> {
private CountDownLatch downLatch;
public Callable2(CountDownLatch downLatch){
this.downLatch = downLatch;
}
@Override
public List<String> call() throws Exception {
List<String> list = new ArrayList<>();
System.out.println("开始2");
//Thread.sleep(1000);
list.add("2");
list.add("4");
downLatch.countDown();
System.out.println("结束2");
return list;
}
}
class Callable3 implements Callable<List<String>>{
private CountDownLatch downLatch;
public Callable3(CountDownLatch downLatch) {
this.downLatch=downLatch;
}
@Override
public List<String> call() throws Exception {
List<String>list=new ArrayList<String>();
System.out.println("开始3");
list.add("6");
list.add("7");
downLatch.countDown();
System.out.println("结束3");
return list;
}
}