笔试题: 使用两个线程交替打印奇偶数

项目路径:

在这里插入图片描述

创建一个打印数字的对象,对象内有一个用于计数的成员变量,一个用于打印偶数的方法,一个用于打印奇数的方法.通过使用阻塞的方式来决定当前线程是否可以打印.

PrintNum.java
package com.beikai.springboottestdemo.writtentest.Thread;

/**
 * @ClassName PrintNum
 * @Description TODO
 * @Author Admin
 * @Date 2019/4/7 22:07
 * @Version 1.0
 **/
public class PrintNum{

    private int num = 0;

    /**
     * 打印偶数
     */
    public synchronized void printOdd(){
        // 判断是否是奇数,如果是的话阻塞
        while (num % 2 != 0){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 如果不是奇数,打印
        System.out.println(Thread.currentThread().getName() + " : " + num);
        num ++;
        // 通知另一个线程
        this.notify();

    }

    /**
     * 打印奇数
     */
    public synchronized void printEven(){
        // 判断是否是奇数,如果不是,阻塞
        while (num % 2 == 0){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 打印结果
        System.out.println(Thread.currentThread().getName() + " : " + num);
        num++;
        // 通知其他线程
        this.notify();
    }
}

创建一个测试对象,对象声明打印数字的对象,分别创建两个线程,用于打印奇数和偶数,在方法中,先判断当前这个数是否是偶数或奇数,如果不是,使用wait()使线程阻塞,通知另一个线程可以打印了

PrintOddAndEven.java
package com.beikai.springboottestdemo.writtentest.Thread;

/**
 * @ClassName PrintOddAndEven
 * @Description TODO
 * @Author Admin
 * @Date 2019/4/7 22:06
 * @Version 1.0
 * 利用线程 一次奇偶数交替打印
 **/
public class PrintOddAndEven {

    public static void main(String[] args) {
        // 声明一个打印对象
        PrintNum printNum = new PrintNum();

        // 创建两个线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                Thread.currentThread().setName("打印偶数的线程 ");
                while (true) {
                    printNum.printOdd();
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                Thread.currentThread().setName("打印奇数的线程");
                while (true) {
                    printNum.printEven();
                }
            }
        }).start();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值