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

代码如下:

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();
                }
            }
        }
    }

}

运行结果:

相关推荐
小雅痞4 小时前
[Java][Leetcode simple] 205. 同构字符串
java·算法·leetcode
小杍随笔4 小时前
【iNovel 后端架构深度解析:基于 Rust + Tauri 2 的桌面应用服务端设计】
jvm·架构·rust
豹哥学前端4 小时前
5分钟搞懂事件委托
前端·javascript·面试
多加点辣也没关系4 小时前
设计模式-策略模式
java·设计模式·策略模式
2601_953660374 小时前
Java Map集合详解与实战
java·开发语言·python
星晨羽4 小时前
java通过共享目录协议下载文件到本地
java
YuanDaima20484 小时前
云计算基础与容器技术演进
java·服务器·人工智能·python·深度学习·云计算·个人开发
java1234_小锋5 小时前
SpringBoot可以同时处理多少请求?
java·spring boot·后端
JAVA面经实录9175 小时前
原码反码补码编码架构与进制底层设计思想
java·架构
wangl_925 小时前
初探 C# 15 的 Union Types
java·开发语言·算法·c#·.net·.net core