工具包: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>