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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马任雪刚 中级黑马   /  2012-5-17 19:55  /  1595 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//关于多线程件通信--生产者消费者的小程序。

class Res
{
private String name;
private int count=1;
private boolean flag=false;

public synchronized void set(String name)
{
  
  if(flag)
   try{wait();}catch(Exception e){}//为什么在这儿被唤醒的|t2不用判断上面的语句,直接进入下一语句??????????
   this.name=name+"---"+count++;//在这儿"name+"---"+count++"是怎么赋给this.name的???????????
   System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
   flag=true;
   this.notify();
  
}
public synchronized void out()
{
  if(!flag)
  
   try{wait();}catch(Exception e){}
   System.out.println(Thread.currentThread().getName()+"消费者"+this.name);
   flag=false;
   this.notify();
  
}
}
class Pro implements Runnable
{
private Res r;
Pro(Res r)
{
  this.r=r;
}
public void run()
{
  int x=0;
  while(true)
  {
   r.set("---商品---");
   x=(x+1)%2;
  }
  
}
}
class Con implements Runnable
{
private Res r;
Con(Res r)
{
  this.r=r;
}
public synchronized void run()
{
  int x=0;
  while(true)
  {
   r.out();
   x=(x+1)%2;
  }
   
  
  
}

}
public class ProConDemo
{
public static void main(String[] args)
{
  Res r=new Res();
  Pro p1=new Pro(r);
  Con c1=new Con(r);
  Thread t1=new Thread(p1);
  Thread t2=new Thread(p1);
  Thread t3=new Thread(c1);
  Thread t4=new Thread(c1);
  t1.start();
  t2.start();
  t3.start();
  t4.start();
}
}

2 个回复

正序浏览
if(flag)
   try{wait();}catch(Exception e){}//为什么在这儿被唤醒的|t2不用判断上面的语句,直接进入下一语句??????????
   this.name=name+"---"+count++;//在这儿"name+"---"+count++"是怎么赋给this.name的???????????
   System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
这是多线程同步的问题。多线程的出现提高了计算机各方面的效率,带来很多好处。其中就有可以让多个程序或线程并发执行。其原理就是:单个cpu是来回切换执行多个程序(线程)达到肉眼的同时执行即并发执行的。计算机配有文件(pcb)记录程序(线程)执行的各种情况包括执行进度,用于cpu下次再来执行它时,可以正确的从断点进行。所以在这儿被唤醒的|t2不用判断上面的语句,直接进入下一语句。而在这儿"name+"---"+count++"是怎么赋给this.name的只是普通的与this.name=name;一样的赋值原理,count只是个记数值,用于区别一下名字的作用而已。
回复 使用道具 举报
if(flag)
  try{wait();}catch(Exception e){}
因为刚开始线程判断flag的时候是假,一进来就进入等待状态了。如果把if改为while,线程已唤醒会进行判断的
this.name=name+"---"+count++;
如果是两个线程在进入等待状态,线程唤醒后,两个线程都会在刚开始的count值加1,name就是当前线程的值。
如果两个线程都没有被唤醒,两个线程会在这一直等待下去,直到线程被唤醒。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马