黑马程序员技术交流社区

标题: 关于多线程的问题 [打印本页]

作者: 黑马任雪刚    时间: 2012-5-17 19:55
标题: 关于多线程的问题
//关于多线程件通信--生产者消费者的小程序。

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();
}
}


作者: 韩国军    时间: 2012-5-18 13:54
if(flag)
  try{wait();}catch(Exception e){}
因为刚开始线程判断flag的时候是假,一进来就进入等待状态了。如果把if改为while,线程已唤醒会进行判断的
this.name=name+"---"+count++;
如果是两个线程在进入等待状态,线程唤醒后,两个线程都会在刚开始的count值加1,name就是当前线程的值。
如果两个线程都没有被唤醒,两个线程会在这一直等待下去,直到线程被唤醒。
作者: 付信榕    时间: 2012-5-18 15:07
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只是个记数值,用于区别一下名字的作用而已。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2