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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 jiangwenjun 于 2015-1-30 03:44 编辑

  • /*
  •     有一个资源
  • 一个线程往里存东西,如果里边没有的话
  • 一个线程往里取东西,如果里面有得话
  • */  
  •   
  • //资源  
  • class Resource  
  • {  
  •     private String name;  
  •     private String sex;  
  •     private boolean flag=false;  
  •       
  •     public synchronized void setInput(String name,String sex)  
  •     {  
  •         if(flag)  
  •         {  
  •             try{wait();}catch(Exception e){}//如果有资源时,等待资源取出  
  •         }  
  •         this.name=name;  
  •         this.sex=sex;  
  •   
  •         flag=true;//表示有资源  
  •         notify();//唤醒等待  
  •     }  
  •   
  •     public synchronized void getOutput()  
  •     {         
  •         if(!flag)  
  •         {  
  •             try{wait();}catch(Exception e){}//如果木有资源,等待存入资源  
  •         }  
  •         System.out.println("name="+name+"---sex="+sex);//这里用打印表示取出  
  •                   
  •         flag=false;//资源已取出  
  •         notify();//唤醒等待  
  •     }  
  • }  
  •   
  •   
  • //存线程  
  • class Input implements Runnable  
  • {  
  •     private Resource r;  
  •     Input(Resource r)  
  •     {  
  •         this.r=r;  
  •     }  
  •     public void run()//复写run方法  
  •     {  
  •         int x=0;  
  •         while(true)  
  •         {  
  •             if(x==0)//交替打印张三和王羲之  
  •             {  
  •                 r.setInput("张三",".....man");  
  •             }  
  •             else  
  •             {  
  •                 r.setInput("王羲之","..woman");  
  •             }  
  •             x=(x+1)%2;//控制交替打印  
  •         }  
  •     }  
  • }  
  •   
  • //取线程  
  • class Output implements Runnable  
  • {  
  •     private Resource r;  
  •     Output(Resource r)  
  •     {  
  •         this.r=r;  
  •     }  
  •     public void run()//复写run方法  
  •     {  
  •         while(true)  
  •         {  
  •             r.getOutput();  
  •         }  
  •     }  
  • }  
  •   
  •   
  •   
  • class ResourceDemo2   
  • {  
  •     public static void main(String[] args)   
  •     {  
  •         Resource r = new Resource();//表示操作的是同一个资源  
  •   
  •         new Thread(new Input(r)).start();//开启存线程  
  •   
  •         new Thread(new Output(r)).start();//开启取线程  
  •     }  
  • }  


请问一下  这里 new Input(r);   new Output(r);  是指向同一个对象?     还是说同一个资源两个线程?本来就是要分开指向不同对象的呢?   这里我不懂了  不是存new Thread()里面是同一对象才能保证吗?   

5 个回复

倒序浏览
本帖最后由 我为你着迷 于 2015-1-30 08:16 编辑

Resource r = new Resource();
Input in=new Input(r);
Output out=new Output(r);
Thread t1=new Thread(in);
Thread t2=new Thread(out);
这样写的话你应该能看的懂吧。
这个是将资源封装成了对象了,将线程执行的任务也封装成了对象,多个线程在操作同一个资源。而你Input和Output里边成员的位置声明了一个r变量,所以你创建构造函数Input和Output的时候你要往里传一个r以便完成对象的初始化动作。
这里边只是通过匿名对象的形式把代码进行简化了  建议楼主好好看下匿名对象这一块
回复 使用道具 举报
这是一个资源的两个线程嘛
不过你给两个线程传递的是同一个对象r
自然他们操作的也是同一个对象了

多线程自然指启动多个线程嘛
回复 使用道具 举报
来看看自学中
回复 使用道具 举报
我为你着迷 发表于 2015-1-30 08:14
Resource r = new Resource();
Input in=new Input(r);
Output out=new Output(r);

明了!!!系同一资源两个线程!!!
回复 使用道具 举报
同一个资源两个线程在操作这个资源!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马