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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 396460221 中级黑马   /  2015-4-16 14:09  /  290 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程的问题,给一个资源命名和年龄,另一边取出来,想法取出资源的名字和年龄 ,从1到10000,总共取出10000个。
但为什么不是从1开始取出的,而是从4000多以后直到最后1000. 请高手帮忙看哪里不对

package lianxi2.WaitNotify2;
public class WaitNotify
{
        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();               
        }
}
class Resource//定义资源
{
        private String name;
        private String sex;
        private boolean flag;
        private int count=1;
        public synchronized void set(String name,String sex)//同步函数的锁是this
        {
                if(flag)
                        try{wait();}catch(Exception e){}//判断标记,如果为真,线程等待,给对象属性赋值
                this.name=name;
                this.sex=sex;
                flag=true;         //改变标记,防止赋值线程再次赋值即防止对一对象赋值两次
                notify();//唤醒另一线程
        }
        public synchronized void out()//同步函数的锁是this
        {       
                if(!flag)
                        try{wait();}catch(Exception e){}//判断标记,如果为真,线程等待
                System.out.println(name+"--"+sex+" 数量为 "+count++);//输出对象属性
                flag=false;        //改变标记,防止输出线程再次输出即防止对一对象输出两次
                notify();//唤醒另一线程
        }
}
class Input implements Runnable//定义输入
{
        private Resource r;
        Input(Resource r)
        {
                this.r=r;
        }
        public void run()//覆盖Runnable接口中的run()方法,线程需要运行的代码
        {
                int y=0;//计数器改变赋值对象
                for(int x=0;x<10000;x++)//while(true)无限循环
                {
                       
                        if(y%2==0)
                        {
                                r.set("张三","男");                                                               
                        }
                        else
                        {
                                r.set("lucy","女女女女女女");                                       
                        }
                        //r.count++;
                        y++;
                        //r.flag=true;
                        //r.notify();
                       
                }
                System.out.println(y);
        }
}
class Output implements Runnable//定义输出
{
        private Resource r;
        Output(Resource r)
        {
                this.r=r;
        }
        public void run()//覆盖Runnable接口中的run()方法,线程需要运行的代码
        {
                for(int x=0;x<10000;x++)//while(true)无限循环
                {                       
                        r.out();                       
                        //r.flag=false;
                        //r.notify();               
                }
        }

}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马