【Java多线程】交替打印奇偶数

这篇具有很好参考价值的文章主要介绍了【Java多线程】交替打印奇偶数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求

使用一个线程对一个数进行循环自增,并且使用另外两个线程对当前的数进行打印,一个线程打印奇数,一个线程打印偶数,要求最终输出结果必须按顺序打印出来

代码

先定义全局变量

// 用于自增的整数
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();

指定三个线程:

  1. 线程一:对一个整型数(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();
                }
            }, "自增线程:");
    
  2. 线程二:打印奇数;

    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();
                }
            }, "奇数线程:");
    
  3. 线程三:打印偶数;文章来源地址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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java八股文面试[多线程]——两个线程交替打印1-100之间的数字

    一份代码,两个线程,使用synchronize实现: 重写run()方法,将输出1到100之间整数的代码写到同步方法里。 线程1进入到同步方法,输出一个整数后,阻塞并释放锁。 线程2进入到同步方法,唤醒线程1,输出整数后,阻塞并释放锁。 线程1和线程2重复第3步,直到输出所有的整数

    2024年02月11日
    浏览(41)
  • 【算法】两个线程交替打印0~100的数

    总结:条件变量相比于条件判断更加繁琐,但是使用条件变量对于CPU的占用更低,如果是执行更繁杂的多线程任务,使用条件变量效率更高。

    2024年02月14日
    浏览(32)
  • 多线程知识:三个线程如何交替打印ABC循环100次

    本文博主给大家讲解一道网上非常经典的多线程面试题目。关于三个线程如何交替打印ABC循环100次的问题。 下文实现代码都基于Java代码在单个JVM内实现。 给定三个线程,分别命名为A、B、C,要求这三个线程按照顺序交替打印ABC,每个字母打印100次,最终输出结果为: 推荐博

    2024年02月12日
    浏览(91)
  • 高频面试题:如何分别用三种姿势实现三个线程交替打印0到100

    最近面试遇到的一道题,需要三个线程交替打印0-100,当时对多线程并不是很熟悉因此没怎么写出来,网上搜了之后得到现 实现思路:判断当前打印数字和线程数的取余,不等于当前线程则处于等待状态。循环结束唤醒所有等待线程。       实现思路:实现方式和synchronize

    2024年02月10日
    浏览(50)
  • 循环交替执行多线程任务-Java

    2024年02月16日
    浏览(36)
  • 用3个go协程交替打印n到m

    解题思路: 创建一个包含三个通道的通道队列 chanQueue ,用于协程之间的通信。 定义一个计数器变量 result ,用于跟踪当前打印的数字。 创建一个退出信号通道 exitChan ,用于通知主函数所有协程已完成任务。 初始化通道队列 chanQueue ,并将最后一个通道中的数据置为非零值

    2024年02月13日
    浏览(31)
  • C# 多线程交替按照指定顺序执行

    1.关于AutoResetEvent和ManualResetEvent的区别解释如下: AutoResetEvent和ManualResetEvent是.NET中的两个线程同步类。它们之间的主要区别在于其释放信号的方式以及对等待线程的影响。 AutoResetEvent的作用是在等待的线程被信号唤醒后,将信号自动重置为非终止状态。也就是说,当一个线程

    2024年02月11日
    浏览(35)
  • 在两道多线程基础题“顺序打印”中对比一下Java中的wait()和join()

    目录 一、基础 二、进阶 有三个线程,线程名称分别为:a,b,c,每个线程打印自己的名称。 需要让他们同时启动,并按 c,b,a的顺序打印。 这道题要求打印 cba,且只打印一次。如何保证线程 cba 的执行顺序?容易想到,只需要让这三个线程按一定顺序串行执行即可,采用

    2024年02月04日
    浏览(36)
  • 【多线程例题】顺序打印abc线程

    顺序打印-进阶版 方法一:三个线程竞争同一个锁,通过count判断是否打印 方法二:三个线程同时start,分别上锁,从a开始,打印后唤醒b 三个线程分别打印A,B,C 方法一:通过count计数打印(三个线程上同样的锁,打印一个,召唤所有锁,如果不满足条件,则wait等待,锁自

    2024年02月16日
    浏览(49)
  • Java IO流 - 打印流详细使用介绍

    打印流基本使用 打印流 : 作用:打印流可以 实现更方便、更高效的打印数据到文件中去 。打印流一般是指:PrintStream,PrintWriter两个类。 可以实现 打印什么数据就是什么数据 ,例如打印整数97写出去就是97,打印boolean的true,写出去就是true。 打印流PrintStream构造器如下 : 构

    2024年02月02日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包