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

来源:互联网 发布:趣味性软件使用教程 编辑:程序博客网 时间:2024/05/01 13:09

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 0