java多线程并发awaitTermination,CountDownLatch 的使用

java 并发之awaitTermination,CountDownLatch 的使用

join会然线程执行完后执行下一步

public static void main(String args[]) throws InterruptedException, ExecutionException {
Thread d = new Thread(new Task3());
		d.start();
		d.join();
		System.out.println("---------");
}		
class Task2 implements Callable<Integer> {
	@Override
	public Integer call() throws Exception {
		System.out.println("---------Task2");
		Thread.sleep(1000);
		return 2;
	}
}
	class Task3 implements Runnable {

	public Task3() {
	}
	@Override
	public void run() {
		System.out.println("---------Task1");
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
	class Task1 implements Runnable {
	CountDownLatch count;
	public Task1(CountDownLatch count) {
		// TODO Auto-generated constructor stub
		this.count = count;
	}
	@Override
	public void run() {
		System.out.println("---------Task1");
		count.countDown();
	}
}

如果需要执行完全部线程再执行下一步调用使用awaitTermination

	ExecutorService executor = Executors.newCachedThreadPool();
		for (int i = 0; i < 100; i++) {
			executor.submit(new Task3());
		}
		executor.shutdown(); // 
		System.out.println("开始等待");
        boolean b = executor.awaitTermination(3, TimeUnit.SECONDS);
        System.out.println("等待完毕");
        if(b){
            System.out.println("分线程已经结束");
        }
        System.out.println(Thread.currentThread().getName());//

使用线程池Callable返回执行结果

executor.awaitTermination(3, TimeUnit.HOURS); // 使用线程池Callable返回执行结果
		for (int i = 0; i < 100; i++) {
			Future<Integer> submit = executor.submit(new Task2());
			System.out.println(submit.get());
		}

在很多高并发的环境下,有可能Callable和FutureTask会创建多次。FutureTask能够在高并发环境下确保任务只执行一次。

		for (int i = 0; i < 100; i++) {
			FutureTask<Integer> futureTask = new FutureTask<>(new Task2());
			executor.submit(futureTask);
			System.out.println(futureTask.get());
		}
		executor.shutdown();
CountDownLatch count = new CountDownLatch(5);
		for (int i = 1; i <= 5; i++) {
			Thread my = new Thread(new Task1(count));
			my.start();
		}

		try {
			count.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("---------");
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CountDownLatchJava并发编程中的一种同步工具类。它的作用是允许一个或多个线程等待其他线程完成操作。CountDownLatch的构造函数接收一个计数值,当计数值变为0时,等待的线程就会被唤醒。使用CountDownLatch可以实现多线程并发编程中的线程协作。 与使用join方法等待多个线程执行完毕不同,CountDownLatch相对灵活。可以通过调用countDown方法来减少计数,唤醒被阻塞的线程。这使得多个线程可以同时进行,并在一定条件下等待其他线程完成后再继续执行。 CountDownLatch一般称为闭锁或计数器,它是Java并发编程中的一种多线程同步工具。它属于AQS(AbstractQueuedSynchronizer)体系的一员,可以实现线程之间的协作和同步操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java多线程并发工具类](https://download.csdn.net/download/weixin_38713057/13756829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [java多线程并发CountDownLatch](https://blog.csdn.net/weixin_42419762/article/details/116220340)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [多线程编程之 CountDownLatch](https://blog.csdn.net/jiangxiayouyu/article/details/118107977)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值