Java并发编程基础---(3)CountDownLatch类总结
2018-03-05 23:00
549 查看
写在前面:
CountDownLatch类在java.util.Concurrent包下在Java API中,是一个同步工具类,对CountDownLatch类的描述是允许一个或者多个线程等待,直到其他线程执行完后再执行。
CountDownLatch类可以使其他线程完成各自的工作后,再执行。比如:在应用程序中,main线程希望在所有框架服务的线程已经启动完所有框架服务之后,再执行。
我们先来看一下没有使用CountDownLatch类的例子:package countDownLatchDemo;
public class CountDownLatchDemo1 {
public static void main(String[] args) throws Exception {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread1");
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread2");
}
});
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.println("线程1,线程2全部输出结束");
}
}
控制台输出结果:thread1
thread2
线程1,线程2全部输出结束
上面的代码,使用了Join方法,首先让主线程,线程2停止执行,等待线程1执行完毕,然后线程2继续执行,主线程等待线程2结束。
注:在线程1调用Join方法之后,开始执行线程1,在线程1执行结束后,JVM会自动调用this.notifyAll()方法(这段代码由于是JVM实现,所以在JDK中查看不到)
countDown方法:
下面我们通过一段测试代码来看一下CountDownLatch的使用:package countDownLatchDemo;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchTest {
static CountDownLatch c = new CountDownLatch(2);//初始化CountDownLatch会等待2个线程或者2个方法执行
public static void main(String[] args) throws Exception {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("1");
c.countDown();
System.out.println("2");
c.countDown();
}
}).start();
c.await();
System.out.println("3");
}
}
上述的代码,程序执行方式:
(1)当CoutLatch方法调用了await方法后,主线程会等待子线程结束后,再执行打印"3"。
(2)在子线程中,第一个c.countDown方法调用后,线程内就会等待"1"先输出,然后c对象构造函数中的count-1.
(3)第二个c.countDown方法调用后,线程内就会等待"2"先输出,然后c对象构造函数中的count-1=0。
(4)此时结束等待,开始继续执行主线程。
控制台输出结果:1
2
3
CountDownLatch类在java.util.Concurrent包下在Java API中,是一个同步工具类,对CountDownLatch类的描述是允许一个或者多个线程等待,直到其他线程执行完后再执行。
CountDownLatch类可以使其他线程完成各自的工作后,再执行。比如:在应用程序中,main线程希望在所有框架服务的线程已经启动完所有框架服务之后,再执行。
我们先来看一下没有使用CountDownLatch类的例子:package countDownLatchDemo;
public class CountDownLatchDemo1 {
public static void main(String[] args) throws Exception {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread1");
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread2");
}
});
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.println("线程1,线程2全部输出结束");
}
}
控制台输出结果:thread1
thread2
线程1,线程2全部输出结束
上面的代码,使用了Join方法,首先让主线程,线程2停止执行,等待线程1执行完毕,然后线程2继续执行,主线程等待线程2结束。
注:在线程1调用Join方法之后,开始执行线程1,在线程1执行结束后,JVM会自动调用this.notifyAll()方法(这段代码由于是JVM实现,所以在JDK中查看不到)
CountDownLatch
构造函数:public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentException("count < 0"); this.sync = new Sync(count); }我们在创建CountDownLatch实例时,我们会传入一个count参数,这个参数表示,主线程会等到count个线程,或者是等待count个方法执行完毕。
countDown方法:
public void countDown() { sync.releaseShared(1); }当CountDownLatch实例每调用一次countDown方法的时候,构造函数的count参数就会-1,并且CountDownLatch的await方法会阻塞当前线程直到count减为0。
下面我们通过一段测试代码来看一下CountDownLatch的使用:package countDownLatchDemo;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchTest {
static CountDownLatch c = new CountDownLatch(2);//初始化CountDownLatch会等待2个线程或者2个方法执行
public static void main(String[] args) throws Exception {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("1");
c.countDown();
System.out.println("2");
c.countDown();
}
}).start();
c.await();
System.out.println("3");
}
}
上述的代码,程序执行方式:
(1)当CoutLatch方法调用了await方法后,主线程会等待子线程结束后,再执行打印"3"。
(2)在子线程中,第一个c.countDown方法调用后,线程内就会等待"1"先输出,然后c对象构造函数中的count-1.
(3)第二个c.countDown方法调用后,线程内就会等待"2"先输出,然后c对象构造函数中的count-1=0。
(4)此时结束等待,开始继续执行主线程。
控制台输出结果:1
2
3
相关文章推荐
- Java高并发编程之第一阶段,多线程基础深入浅出
- Java并发编程艺术 4 Java并发编程基础
- Java基础之高并发编程
- Java并发编程基础
- 并发编程总结1——java线程基础1
- Java 并发编程之基础构建模块
- Java并发编程实战:并发基础构建模块
- 一、Java并发编程基础篇(001)synchronized
- Java并发编程札记-(一)基础-05线程安全问题
- Java 并发编程实战之 基础构建模块
- moon java 并发的基础知识--名词解释部分 以编程思想的第21章为基础
- Java 并发编程实践基础 读书笔记: 第二章 构建线程安全应用程序
- Java 并发编程之美:并发编程基础晋级篇-chat
- Java基础--并发编程基础(3)
- Java 并发编程 基础
- Java 并发编程 基础 一
- Java并发编程,并发基础
- Java 并发编程基础学习
- 【Java并发编程的艺术】【学习笔记】并发基础
- Java 并发编程基础