实现两个线程A,B,A打印5个奇数,B打印5个偶数,交替进行,如此循环50次

1.要点: 

(1). 在同一个类中实现打印奇数和打印偶数的方法,并且这两个方法都需要被synchronized修饰,因为wait() notify()只能在synchronized修饰的代码块中运行。 
(2). 在类中设置一个线程执行的标志oddOrder,这个标志用来说明线程执行的次数,如果oddOrder==true,说明轮到打印奇数的线程执行了,如果为false,说明轮到打印偶数的线程的执行了。 
(3). 方法中一定是先调用notify(),然后再调用wait(),不然线程只执行一次(因为都进入wait状态,或标志oddOrder未修改成功)。 
(4). 在主函数中用同一个对象实现打印奇数和偶数的功能,因为wait()只是释放本对象的对象锁。

package com.thread.test;

public class ThreadTest {

	public static void main(String[] args) {
        final PrintNum pn = new PrintNum();  //使用同一个对象执行任务

        new Thread(new Runnable() {  //打印奇数线程
            @Override
            public void run() {
                for(int i=0;i<10;i++){  //执行10次
                    pn.printOdd();
                }
                System.out.println("first thread stop !");
            }
        }).start();

        new Thread(new Runnable(){  //打印偶数线程
            @Override
            public void run() {
                for(int i=0;i<10;i++){
                    pn.printEven();
                }
                System.out.println("second thread stop !");
            }
        }).start();
    }
}

class PrintNum{

    private int cur = 1;

    private boolean printOddFlag = true;    //打印odd的标志位

    //打印5个奇数
    public synchronized void printOdd(){

        if(!printOddFlag){
            try {
            	//释放对象锁
            	//线程在获取对象锁后,主动释放对象锁,同时本线程休眠
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        for(int i=cur;i<cur+10;i+=2){
            System.out.print(i+" ");
        }
        System.out.println();
        printOddFlag = false;
        //对象锁的唤醒操作
        //唤醒其他所有进程(其实只有一个),线程执行到此不是立即释放对象锁,而是要退出synchronized代码块后,当前线程才会释放对象锁
        this.notify();  
        
    }

    //打印5个偶数
    public synchronized void printEven() {

        if(printOddFlag){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for(int i=cur+1;i<cur+1+10;i+=2){
            System.out.print(i+" ");
        }
        System.out.println();

        cur += 10;
        printOddFlag = true;
        this.notify();
    }
	
	
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值