JUC之线程顺序执行
方式一:使用Thread中的join()
join() 用于不断让当前线程等待join线程之行结束。其原理就是不停的检查join线程是否存活,如果join线程存活则让当前线程永远等待。其中源码中wait(0)表示永远等待下去。直到线程被唤醒。
代码实现如下
public class ThreadSequentialExecutionTest { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.println("T1 test."); } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { System.out.println("T2 test."); } }); Thread t3 = new Thread(new Runnable() { @Override public void run() { System.out.println("T3 test."); } }); t1.start(); t2.start(); t3.start(); t1.join(); t2.join(); t3.join(); } }
结果如下
T1 test. T3 test. T2 test.
方式二:使用jdk1.5之后的CountDownLatch
使用这个api也可以实现线程的join功能,并且比join功能更多。 当我们调用CountDownLatch的countDown方法时,计数器会减一,CountDownLatch的await方法会阻塞当前线程,直到计数器变为0,再次调用await()便不会阻塞当前线程。countDown()可以使用在任何地方。 当某个线程处理的比较慢,我们不能让主线程一直阻塞等待,await(long time, TimeUtil unit)在等待特定时间后,将不会阻塞当前线程。join()也有类似方法。
代码实现
import java.util.concurrent.CountDownLatch; public class CountDownLatchTest { //接受一个int类型的参数作为计数器。如果你想等待n个点完成就需要在构造函数中传入n private static CountDownLatch countDownLatch = new CountDownLatch(4); public static void main(String[] args) throws InterruptedException { new Thread(new Runnable() { @Override public void run() { System.out.println(1); countDownLatch.countDown(); System.out.println(2); countDownLatch.countDown(); } }).start(); new Thread(new Runnable() { @Override public void run() { System.out.println(3); countDownLatch.countDown(); } }).start(); new Thread(new Runnable() { @Override public void run() { System.out.println(4); countDownLatch.countDown(); } }).start(); countDownLatch.await(); System.out.println(5); } }
结果输出
1 2 3 4 5