首先我们会想到要实现交替打印,那么就要其中一个执行的时候,另外一个处于等待状态,当该线程执行完的时候,唤醒另外一个。如此执行就可实现。
我们可以通过wait和notify对线程进行状态控制,并且我们需要两个监视器分别对这两个线程的wait和notify控制。如果用synchronized的wait和notify,实现起来比较麻烦(只有wait在相同的锁和监视器上的线程,才能被唤醒),因为对于同一个锁,我们需要不同的监视器进行控制wait和notify。这种情况下,Condition可以比较好的支持.
Condition:能够更加精细的控制多线程的等待与唤醒,并且对于同一个锁可以创建多个Condition监视器。
代码如下:
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; /** * 两个线程交替打印1-10数字 * @author happigfemale * */ public class ThreadTest { //可重入锁 private ReentrantLock lock = new ReentrantLock(); //Condition信号1 private Condition c1 = lock.newCondition(); //Condition信号2 private Condition c2 = lock.newCondition(); private int count = 0; public void countMethod(){ Thread t1 = new Thread("T1"){ public void run(){ while(count < 10){ lock.lock(); try { System.out.println(Thread.currentThread().getName() + ":" +count); count ++; c1.await();//c1将线程1从运行状态->阻塞等待 c2.signal();//c2将线程2从阻塞等待->唤醒状态 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ lock.unlock(); } } } }; Thread t2 = new Thread("T2"){ public void run(){ while(count < 10){ lock.lock(); try { System.out.println(Thread.currentThread().getName() + ":" +count); count ++; c1.signal();//c1将线程1从阻塞等待->唤醒状态 c2.await();//c2将线程2从运行状态->阻塞等待 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ lock.unlock(); } } } }; //线程t1启动 t1.start(); while(count == 0){//保证t1先执行 ; } //线程t2启动 t2.start(); } public static void main(String[] args) { new ThreadTest().countMethod(); } }
执行结果:
T1:0
T2:1
T1:2
T2:3
T1:4
T2:5
T1:6
T2:7
T1:8
T2:9