A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 838814131 中级黑马   /  2015-9-7 23:05  /  297 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

涉及的方法:
                1.wait():让线程处于冻结状态,被wait的线程会被存储到线程池中
                2.notify():唤醒线程池中一个线程(任意)
                3.notifyAll():唤醒线程池中的所有线程

        这些方法都必须定义在同步中。
        
        因为这些方法是用于操作线程状态的方法。
        必须要明确到底操作的是哪个锁上的线程。

        为什么操作线程的方法wait notify notifyAll定义在了Object类中?

        因为这些方法是监视器的方法,监视器其实就是锁。

        锁可以是任意的对象,任意的对象调用的方式一定定义在Object类中。

*/


//资源
class Resource
{
        private String name;
        private String sex;
        boolean flag = false;
        
        public synchronized void set(String name,String sex)
        {
                        if(flag)
                        try{this.wait();} catch(InterruptedException e){}
                this.name = name;
                this.sex = sex;
                        flag = true;
                        notify();
        }
        public synchronized void out()
        {
                if(!flag)
                try{this.wait();} catch(InterruptedException e){}
                System.out.println(name+"..."+sex);
                flag = false;
                notify();                        
        }
}
//输入
class Input implements Runnable
{
        Resource r;
        Input(Resource r)
        {
                this.r = r;
        }
        public void run()
        {
                int x = 0;
                while(true)
                {
                                if(x==0)
                                {
                                        r.set("xiaoqiang","nan");
                                }
                                else
                                {
                                        r.set("小梅","女女女女女女");
                                }
                        x = (x+1)%2;
                }
        }
}
//输出
class Output implements Runnable
{
        Resource r;
        Output(Resource r)
        {
                this.r = r;
        }
        public void run()
        {
                while(true)
                {
                        r.out();
                }
        }
}
class  ResourceDemo3
{
        public static void main(String[] args)
        {
                //创建资源
                Resource r = new Resource();
                //创建任务
                Input in = new Input(r);
                Output out = new Output(r);
                //创建线程,执行路径
                Thread t1 = new Thread(in);
                Thread t2 = new Thread(out);
                //开启线程
                t1.start();
                t2.start();

        }
}

1 个回复

倒序浏览
不错!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马