java利用CountDownLatch来制定线程执行顺序

工具包:java.util.concurrent.CountDownLatch;

使用的情景:多线程并发下,某个或某些线程需要在其他线程执行完后才启动。CountDownLatch会生成一个计数器,当计算器值=0的时候,被阻塞的线程才会开始运行。

多线程并发,线程的启动模式遵循同一父亲,并列地位,而不是父子孙类;

比如:利用多线程读写分析文件并输入分析结果,在MainActivity主线程中,开启一个线程去读写文件,开启多个线程去分析文件,最后在开启一个线程来输出结果;

而不是:MainActivity中,开启现在去读写文件,然后在读写文件中在开启线程去分析文件,这样写不利于线程的控制。

以上面例子为例:明显输出结果的线程需要在读写文件的线程很分析文件的线程结束后,才可以运行,因此可以在代码中加入以下就可以实现:

<span style="font-size:18px;">public class MainActivity
{
	public static CountDownLatch countDownLatch=new CountDownLatch(2);//阻塞次数初始为2,可以任意改你需要的
	public static void main(String[]args)
	{
		Thread read=new Thread(new ReadThread());
		read.start();
		
		Thread explain=new Thread(new ExplainThread());
		explain.start();
		
		Thread print=new Thread(new OutPrint());
		print.start();
		//输出线程会最后完成
	}
}


public class ReadThread implements Runnable
{
	public void run()
	{
		......
		//读文件
		......
		MainActivity.countDownLatch.countDown();//计数器-1
	}
}

public class ExplainThread implements Runnable
{
	public void run()
	{
		........
		//分析文件
		........
		MainActivity.countDownLatch.countDown();//计数器-1
	}
}
public class OutPrint implements Runnable
{
	public void run()
	{
		MainActivity.countDownLatch.await();//在这里阻塞,直到计算器为0,后面语句才执行
		........
		//输出
		........
	}
}</span>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CountDownLatchJava中的一个同步工具类,它用于控制多个线程之间的执行顺序CountDownLatch可以在一个或多个线程等待其他线程完成之前进行等待,直到所有线程都完成它才继续执行。 具体地说,CountDownLatch的使用场景一般是这样的:一个线程或多个线程需要等待其他线程完成某些操作之后才能执行,而其他线程完成操作之后需要通知等待的线程继续执行。这时就可以使用CountDownLatch来实现线程的顺序执行。 具体实现方式如下: 1. 创建一个CountDownLatch对象,设置计数器的初始值为等待的线程数。 2. 在等待的线程中调用CountDownLatch的await()方法进行等待,直到计数器值为0。 3. 在其他线程完成操作之后,调用CountDownLatch的countDown()方法将计数器的值减1,表示有一个线程完成操作。 4. 当计数器的值为0时,等待的线程就可以继续执行。 示例代码如下: ``` import java.util.concurrent.CountDownLatch; public class CountdownLatchExample { public static void main(String[] args) throws InterruptedException { CountDownLatch latch = new CountDownLatch(3); Thread t1 = new Thread(() -> { System.out.println("Thread 1 is running"); latch.countDown(); }); Thread t2 = new Thread(() -> { System.out.println("Thread 2 is running"); latch.countDown(); }); Thread t3 = new Thread(() -> { System.out.println("Thread 3 is running"); latch.countDown(); }); t1.start(); t2.start(); t3.start(); latch.await(); System.out.println("All threads have finished running"); } } ``` 在上述代码中,创建了一个CountDownLatch对象,计数器的初始值为3,表示需要等待3个线程完成操作。然后创建3个线程,每个线程完成操作之后都会调用countDown()方法将计数器的值减1。最后在主线程中调用await()方法进行等待,直到计数器的值为0,表示所有线程都已经完成操作。当计数器的值为0时,主线程就可以继续执行

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值