面试:双线程交替打印奇偶数

代码如下:

java 复制代码
package practice1;

/**
 * 0-100的奇数偶数打印
 * 1、通过对象的wait和notify进行线程阻塞
 * 2、通过对num%2的结果进行奇数偶数的判断输出
 *
 */
public class JiOuOne {

    private static volatile int num = 0;

    private static final int max = 100;

    public static void main(String[] args) {
        String monitor = "monitor";
        // 偶数线程
        Thread oddThread = new Thread(new OddNumber(monitor));
        oddThread.setName("偶数打印:");

        // 奇数线程
        Thread evenThread = new Thread(new EvenNumber(monitor));
        evenThread.setName("奇数打印:");

        oddThread.start();
        evenThread.start();
    }


    /**
     * 打印偶数
     */
    static class OddNumber implements Runnable {

        private String monitor;

        public OddNumber(String monitor) {
            this.monitor = monitor;
        }

        @Override
        public void run() {
            while (num <= max) {
                synchronized (monitor) {
                    // 如果num%2有余数,则除不尽,则阻塞
                    while (num % 2 != 0) {
                        try {
                            monitor.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(Thread.currentThread().getName() + "->" + num);
                    num++;
                    // 唤醒监视器
                    monitor.notify();
                }
            }
        }
    }


    /**
     * 打印奇数
     */
    static class EvenNumber implements Runnable {

        private String monitor;

        public EvenNumber(String monitor) {
            this.monitor = monitor;
        }

        @Override
        public void run() {
            while (num < max) {
                synchronized (monitor) {
                    // 如果num%2余数为0,则可以除尽,阻塞
                    while (num % 2 == 0) {
                        try {
                            monitor.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(Thread.currentThread().getName() + "->" + num);
                    num++;
                    // 唤醒对象监视器
                    monitor.notify();
                }
            }
        }
    }

}

运行结果:

相关推荐
我登哥MVP几秒前
SpringCloud 核心组件解析:分布式配置管理
java·spring boot·分布式·spring·spring cloud·java-ee·maven
lihao lihao2 分钟前
linux线程
java·开发语言·jvm
满怀冰雪3 分钟前
第13篇-栈算法入门-括号匹配-表达式与单调栈基础
java·算法
我是一颗柠檬7 分钟前
【Java项目技术亮点】Redis Lua脚本原子化操作:高并发场景下的终极武器
java·redis·lua
swg3213218 分钟前
Redis实现主从选举
java·前端·redis
Java 码思客10 分钟前
【ElasticSearch 从入门到架构师】第6章_分词器与文本检索
java·elasticsearch
Flittly10 分钟前
【AgentScope Java新手村系列】(6)Hook与Middleware
java·spring boot·笔记·spring·ai
向量引擎10 分钟前
AI API 正在进入“请求生命周期治理”阶段:从模型迁移、Agent 接入到成本与安全排错的工程化方法
java·人工智能·python·aigc·ai编程·ai写作·gpu算力
牛油果子哥q16 分钟前
二叉树(Binary Tree)零基础精讲,树基础概念、树形分类、核心性质、递归/层序遍历、完整代码与面试考点全解
c++·面试·数据挖掘
许彰午19 分钟前
34_Java设计模式之单例模式
java·单例模式·设计模式