美文网首页
交替打印奇偶数

交替打印奇偶数

作者: 叶雨文 | 来源:发表于2018-12-27 22:15 被阅读0次

    /**

    * 交替打印奇偶数

    * 用condition来做信号量实现奇数偶数的交替打印

    * @author wanghao

    * @date 2018年12月25日

    */

    import java.util.concurrent.locks.Condition;

    import java.util.concurrent.locks.Lock;

    import java.util.concurrent.locks.ReentrantLock;

    public class NumberPrint {

    private int index;

    private Lock lock = new ReentrantLock();

    private Condition oddConditon = lock.newCondition();

    private Condition evenCondition = lock.newCondition();

    public void printOdd() throws InterruptedException {

    lock.lock();

    try {

    while (index < 1000) {

    if (index % 2 == 0)

    oddConditon.await();

    System.out.println(Thread.currentThread().getName() + ":" + index++);

    evenCondition.signal();

    }

    } finally {

    lock.unlock();

    }

    }

    /**

    * 举例。如果到了999,偶数线程await,奇数线程不论之前被signal之后抢占到了锁还是evenCondition.await让出了锁,都能获得执行的权限,打印1000

    * @throws InterruptedException

    */

    public void printEven() throws InterruptedException {

    lock.lock();

    try {

    while (index < 1000) {

    if (index % 2 == 1)

    evenCondition.await();

    System.out.println(Thread.currentThread().getName() + ":" + index++);

    oddConditon.signal();

    }

    } finally {

    lock.unlock();

    }

    }

    public static void main(String[] args) {

    NumberPrint numberPrint = new NumberPrint();

    Thread thread1 = new Thread(() -> {try {

    numberPrint.printOdd();

    } catch (InterruptedException e) {

    e.printStackTrace();

    }});

    thread1.setName("odd thread");

    Thread thread2 = new Thread(() -> {try {

    numberPrint.printEven();

    } catch (InterruptedException e) {

    e.printStackTrace();

    }});

    thread2.setName("eve thread");

    thread2.start();

    thread1.start();

    }

    }

    相关文章

      网友评论

          本文标题:交替打印奇偶数

          本文链接:https://www.haomeiwen.com/subject/hqqjlqtx.html