JavaSE 5的java.util.concurrent引入了大量设计用来解决并发问题的新类,学习使用它们有助于编写出更加简而健壮的编码。
1、CountDownLatch
被用来同步多个任务,强制等待由其它任务执行完成后再执行。
示例:
JobA.java
package thread;
import java.util.concurrent.CountDownLatch;
public class JobA extends Thread {
private CountDownLatch cdl;
public JobA(CountDownLatch cdl) {
this.cdl = cdl;
}
public void run() {
System.out.println("Job A doing something.");
try {
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Job A done.");
cdl.countDown();
}
}
JobB.java
package thread;
import java.util.concurrent.CountDownLatch;
public class JobB extends Thread {
private CountDownLatch cdl;
public JobB(CountDownLatch cdl) {
this.cdl = cdl;
}
public void run() {
System.out.println("Job B doing something.");
try {
Thread.sleep(20000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Job B done.");
cdl.countDown();
}
}
JobC.java
package thread;
import java.util.concurrent.CountDownLatch;
public class JobC extends Thread {
private CountDownLatch cdl;
public JobC(CountDownLatch cdl) {
this.cdl = cdl;
}
public void run() {
System.out.println("Job C waiting.");
try {
cdl.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Job C done.");
}
}
ThreadTest.java
package thread;
import java.util.concurrent.CountDownLatch;
public class ThreadTest {
public static void main(String[] args) {
CountDownLatch cdl = new CountDownLatch(2);
JobA jobA = new JobA(cdl);
JobB jobB = new JobB(cdl);
JobC jobC = new JobC(cdl);
jobA.start();
jobB.start();
jobC.start();
}
}
输出如下:
Job B doing something.
Job A doing something.
Job C waiting.
Job A done.
Job B done.
Job C done.