1.join 阻塞,这种意味着多个任务变成串行的,意义不太大
@Test
//串行执行
public void TestJoin() throws InterruptedException {
List<Thread> threadList=new ArrayList<>();
for (int i = 0; i < 10; i++) {
int finalI = i;
Thread thread=new Thread(()->{
System.out.println(finalI);
});
thread.start();
threadList.add(thread);
}
for (Thread thread : threadList) {
thread.join();
}
System.out.println("结束");
}
2.CompletableFuture 利用allof阻塞
@Test
//并行执行
public void TestComplateableFuture() throws ExecutionException, InterruptedException {
CompletableFuture [] completableFutures=new CompletableFuture[10];
for (int i = 0; i < 10; i++) {
int finalI = i;
CompletableFuture future=CompletableFuture.supplyAsync(()->{
System.out.println(finalI);
return finalI;
});
completableFutures[i]=future;
}
CompletableFuture.allOf(completableFutures).get();
System.out.println("结束");
}
3.FutureTask FutureTask的get()方法会自动阻塞,知道得到任务执行结果为止
@Test
//并行执行
public void TestFuture(){
List<FutureTask<Integer>> futureTasks=new ArrayList<>();
ExecutorService pool = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
int finalI = i;
FutureTask futureTask=new FutureTask(new Callable() {
@Override
public Object call() throws Exception {
return finalI;
}
});
futureTasks.add(futureTask);
pool.submit(futureTask);
}
Integer result = 0;
for (FutureTask<Integer> task : futureTasks) {
try {
//FutureTask的get()方法会自动阻塞,知道得到任务执行结果为止
result += task.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
pool.shutdown();
System.out.println("多线程多任务执行结果:" + result);
}