java concurrent 等待_java并发编程学习:如何等待多个线程执行完成

展开全部

实现方式多种多样,下面列两种供参考:62616964757a686964616fe78988e69d8331333365663566import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.*;

public class Main {

public static void main(String[] args) throws InterruptedException, ExecutionException {

System.out.println("方式1");

System.out.println("================================================");

// 方式1

// 创建一个线程池,并创建10个线程放入线程池执行

ExecutorService pool = Executors.newCachedThreadPool();

for (int i = 0; i 

pool.execute(new MyThread("线程" + i));

}

// 线程池不再接收新任务

pool.shutdown();

// 线程池中的所有线程都执行完pool.isTerminated()才返回true

while (!pool.isTerminated()) {

Thread.sleep(100);

}

System.out.println("所有线程执行完成");

System.out.println("\n\n方式2");

System.out.println("================================================");

// 方式2

ExecutorService pool2 = Executors.newCachedThreadPool();

List futures = new ArrayList<>();

for (int i = 0; i 

// 使用实现Callable接口的方式创建线程,通过Future可以获取线程中返回的结果

Future future = pool2.submit(new MyThread2("线程" + i));

futures.add(future);

}

for (Future future : futures) {

// 该方法会阻塞主线程,直到线程执行完成

future.get();

}

System.out.println("所有线程执行完成");

}

}

class MyThread extends Thread {

private String name;

public MyThread(String name) {

this.name = name;

}

@Override

public void run() {

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(name + "执行完成");

}

}

class MyThread2 implements Callable {

private String name;

public MyThread2(String name) {

this.name = name;

}

@Override

public Object call() throws Exception {

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(name + "执行完成");

return null;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值