1 java多线程中有一个同步计数器:CountDownLatch。可用于多线程的一个同步的计数器。主要的用法函数:构造函数、countDown()、await()。同步计数器的作用:当在主线程中需要等待别的多个子线程完成之后当前主线程才能继续往下执行时,不然一直等待多个子线程执行完毕。这时就可以使用同步计数器(CountDownLatch)。
2 CountDownLatch的构造函数中的参数是一个整数。如果构造函数中传入了整数参数,则表示等待所传入的这么多子线程。创建CountDownLatch对象后,需要将其对象传入到子线程中。在子线程的run方法的最后执行countDownLatch对象的countDown方法表示可以减一,表示这个子线程执行完毕了。
如:CountDownLatch countDownLatch=new CountDownLatch(2);//构造函数中设置等待几个线程数
Thread1 thread1=new Thread1(countDownLatch);//将countDownLatch对象传入到子线程中
Thread2 thread2=new Thread2(countDownLatch);//将countDownLatch对象传入到子线程中
thread1.start();
thread2.start();
子线程:
public class Thread1 extends Thread{
private CountDownLatch countDownLatch;//子线程中创建用于接收的countDownLatch对象
public Thread1(CountDownLatch countDownLatch_){//创建有countDownLatch对象的构造函数
this.countDownLatch=countDownLatch_;//将其主线程中创建的countDownLatch传入进来
}
public void run() {
// TODO Auto-generated method stub
//super.run();
for(int i=0;i<4;i++){
//System.out.println(Thread.currentThread().getName()+" "+new java.util.Date().toLocaleString());
System.out.print(".");
try {
Thread.sleep(1000*1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
countDownLatch.countDown();//在run方法的最后,执行countDownLatch的countDown方法。countDownLatch的数目减一
}
}
3 在主线程中CountDownLatch的await()方法表示一直等待CountDownLatch的计数器减为0为止,不然一直等待。
如:countDownLatch.await();//等待countDownLatch的数目减到0为止。一直等待。直到为0
总结:
CountDownLatch的三个主要用法函数:
构造函数 =====用法:设置等待子线程的数目
countDown()=====用法:countDownLatch的数目减一
await() =====用法:一直等待countDownLatch的数目减为0。如果不为0则一直等待。
再次整体总结:
CountDownLatch是多线程的同步计数器,用于多个子线程的控制。(控制多个子线程)
而Thread对象的join方法是控制当前线程的,只能控制当前线程自身。(控制一个子线程)
2 CountDownLatch的构造函数中的参数是一个整数。如果构造函数中传入了整数参数,则表示等待所传入的这么多子线程。创建CountDownLatch对象后,需要将其对象传入到子线程中。在子线程的run方法的最后执行countDownLatch对象的countDown方法表示可以减一,表示这个子线程执行完毕了。
如:CountDownLatch countDownLatch=new CountDownLatch(2);//构造函数中设置等待几个线程数
Thread1 thread1=new Thread1(countDownLatch);//将countDownLatch对象传入到子线程中
Thread2 thread2=new Thread2(countDownLatch);//将countDownLatch对象传入到子线程中
thread1.start();
thread2.start();
子线程:
public class Thread1 extends Thread{
private CountDownLatch countDownLatch;//子线程中创建用于接收的countDownLatch对象
public Thread1(CountDownLatch countDownLatch_){//创建有countDownLatch对象的构造函数
this.countDownLatch=countDownLatch_;//将其主线程中创建的countDownLatch传入进来
}
public void run() {
// TODO Auto-generated method stub
//super.run();
for(int i=0;i<4;i++){
//System.out.println(Thread.currentThread().getName()+" "+new java.util.Date().toLocaleString());
System.out.print(".");
try {
Thread.sleep(1000*1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
countDownLatch.countDown();//在run方法的最后,执行countDownLatch的countDown方法。countDownLatch的数目减一
}
}
3 在主线程中CountDownLatch的await()方法表示一直等待CountDownLatch的计数器减为0为止,不然一直等待。
如:countDownLatch.await();//等待countDownLatch的数目减到0为止。一直等待。直到为0
总结:
CountDownLatch的三个主要用法函数:
构造函数 =====用法:设置等待子线程的数目
countDown()=====用法:countDownLatch的数目减一
await() =====用法:一直等待countDownLatch的数目减为0。如果不为0则一直等待。
再次整体总结:
CountDownLatch是多线程的同步计数器,用于多个子线程的控制。(控制多个子线程)
而Thread对象的join方法是控制当前线程的,只能控制当前线程自身。(控制一个子线程)