黑马程序员技术交流社区
标题:
问个问题,我一直想不明白!
[打印本页]
作者:
。。。。。。。
时间:
2013-12-4 15:04
标题:
问个问题,我一直想不明白!
多线程中,线程wait方法抛出异常后,就释放了锁进入了临时堵塞状态,当该线程被唤醒以后,为什么还要去判断while语句的参数呢?wait方法不是在while语句内吗,应该是唤醒后继续往下运行撒
作者:
。。。。。。。
时间:
2013-12-4 15:07
重点在于:被唤醒以后为什么还会去判断while语句条件,先不是已经判断过了吗?难道不是应该继续向下执行吗?
作者:
。。。。。。。
时间:
2013-12-4 15:07
求高人指点,在线坐等!
作者:
天下
时间:
2013-12-4 15:38
本帖最后由 天下 于 2013-12-4 15:49 编辑
哥们,不知道你是指的哪一个例子;
比如:生产者消费者那个例子,循环判断是为了保证不产生数据错乱,
//如下定义了一个产品类,产品类有自己的属性,然后创建了两个Runnable线
//程类,一个为生产者Producer和消费者Consumer,这两个类持有了对产品类
//的引用,可以方法和操作产品类对象的属性,达到生产者在刷新产品的属性,//模仿了产品生产的过程,而消费者便可以取得产品的信息,模仿了产
//品被消费的过程。
packagecom.thread;
public classProducerAndConsumer
{
public static void main(String[] args)
{
Product p = new Product();
Producer pr = new Producer(p);
Consumer cr = new Consumer(p);
Thread t1 = new Thread(pr);
Thread t2 = new Thread(pr);
Thread t3 = new Thread(cr);
Thread t4 = new Thread(cr);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
//定一个产品类
class Product
{
private String name;
private int ID = 1;
public boolean flag = false;
public synchronized void setProperty(String name)
{
while(flag)
{
try
{
this.wait();
}
catch(Exception e)
{
};
}
this.name =name+" "+ID++;
System.out.println(Thread.currentThread().getName()+" 生产出 "+this.name);
flag = true;
this.notifyAll();
}
public synchronized void getInfo()
{
//这里使用Wlile而不是if实用为while会条件会被判断两次,不会到一个产品被//消费两次,或程序挂起的状况。
while(!flag)
{
try
{
this.wait();
}
catch(Exception e)
{
};
}
System.out.println(Thread.currentThread().getName()+" 消费了 "+this.name+" o(∩_∩)o...哈哈!!!");
flag = false;
//这里notifyAll()是为了防止之唤醒本对列的线程,却没有唤醒对方的线程,最
//终导致程序都进入wait状态,程序挂起。
this.notifyAll();
}
}
class Producer implements Runnable
{
private Product p;
public Producer(Product p)
{
this.p = p;
}
@Override
public void run()
{
while(true)
{
p.setProperty("糖果");
}
}
}
class Consumer implements Runnable
{
private Product p ;
publicConsumer(Product p)
{
this.p = p;
}
@Override
public void run()
{
while(true)
{
p.getInfo();
}
}
}
复制代码
作者:
lichao
时间:
2013-12-4 21:51
你可以将wait语句看成普通语句,它在while语句中,当它运行完了的时候当然要去while内进行语句判断呀!
希望对你有所帮助!!!!!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2