需求
使用一个线程对一个数进行循环自增,并且使用另外两个线程对当前的数进行打印,一个线程打印奇数,一个线程打印偶数,要求最终输出结果必须按顺序打印出来
代码
先定义全局变量
// 用于自增的整数
private volatile int i = 0;
// 锁对象
private final Lock lock = new ReentrantLock();
// 满足打印偶数的 Condition
private final Condition evenCondition = lock.newCondition();
// 满足打印奇数的 Condition
private final Condition oddCondition = lock.newCondition();
指定三个线程:
-
线程一:对一个整型数(i<50)进行递增
Thread thIncr = new Thread(() -> { try { lock.lock(); while (i < 50) { // 每次自增判断奇偶 if ((i & 1) == 0) { // 当为偶数时,唤醒等待打印偶数的线程 evenCondition.signal(); // 等待打印偶数的线程打印完成 evenCondition.await(); } else { // 当为奇数时,唤醒等待打印偶数的线程 oddCondition.signal(); // 等待打印奇数的线程打印完成 oddCondition.await(); } // 每次循环加 1 i = i + 1; } } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } }, "自增线程:");
-
线程二:打印奇数;文章来源:https://www.toymoban.com/news/detail-497239.html
Thread thOdd = new Thread(() -> { try { lock.lock(); while (i < 50) { // 当 i 为偶数时 if ((i & 1) == 0) { // 等待满足奇数的条件 oddCondition.await(); continue; } // 打印当前奇数 System.out.println(Thread.currentThread().getName() + i); // 通知自增线程打印完成 oddCondition.signal(); // 并重新等待满足奇数的条件 oddCondition.await(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }, "奇数线程:");
-
线程三:打印偶数;文章来源地址https://www.toymoban.com/news/detail-497239.html
Thread thEven = new Thread(() -> { try { lock.lock(); // 当 i 为奇数时 while (i < 50) { if ((i & 1) == 1) { // 等待满足偶数的条件 evenCondition.await(); continue; } // 打印当前偶数 System.out.println(Thread.currentThread().getName() + i); // 通知自增线程打印完成 evenCondition.signal(); // 并重新等待满足偶数的条件 evenCondition.await(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }, "偶数线程:");
运行结果
偶数线程:0
奇数线程:1
偶数线程:2
奇数线程:3
偶数线程:4
奇数线程:5
偶数线程:6
奇数线程:7
偶数线程:8
......
......
偶数线程:44
奇数线程:45
偶数线程:46
奇数线程:47
偶数线程:48
奇数线程:49
到了这里,关于【Java多线程】交替打印奇偶数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!