【第 06 个代码模型】综合案例:生产者与消费者(解决重复操作问题)
一、方法名称
| NO. | 方法名称 | 类型 | 描述 |
|---|---|---|---|
| 01 | Public final void wait()throws InterruptedException | 普通 | 等待、死等 |
| 02 | Pudlic final void notify() | 普通 | 唤醒第一个等待线程 |
| 03 | Pudlic final void notify() | 普通 | 唤醒全部等待线程,那个优先级高,谁有可能先执行 |
现在的代码之中依然会存在有数据的重复设置或重复取出的问题,所以如果想要解决他就必须增加等待与唤醒机制。如果要想使用这一功能,就必须参考 Object 类中提供的方法;
二、范例
通过等待与唤醒机制来解决数据的重复操作问题
private string title;private string note;
// flag = true:表示允许生产,但是不允许消费者取走
//falg = false:表示生产完毕,允许消费者取走,但是不能够生产
private boolean flag = true ;
public synchronized void get( {
if (flag m= true) { //已经生产了,所以不允许重复生产
try i.super.wait(o;//t等待执行
catch (InterruptedException e) ie.printstackTrace(;
}
Thread.sleep(5e);
}catch (InterruptedException e) {e.printstackTrace();
if (flag == false){ //已经生产了,所以不允i
this.flag = false ; //表示已经生产过了,不允许再生产了
super.notify; //唤醒等待线程|
public synchronized void set(string title,string note) {
if (this.flag == false) i //广现在不允许取走
try i
super.wait(o;//等待执行
}catch (InterruptedException e) f.e.printstackTrace(o;
this.title = title ;
try i
Thread.sleep(10);
}catch (InterruptedException e) ie.printstackTrace();
this.note = note ;
public synchronized void set(String title,strir
if (this.flag == true i//现在不允许取走
trv {
this.note = note ;
this.flag = true ; l/表示继续生产super.notify(); l
}
面试题:请解释是 sleep()与wait() 的区别?
sleep() 是 Thread 类中定义的方法,到了一定的时间后该休眠的线程可以自动唤醒
wait()Object 类中的定义的方法,如果想要唤醒,必须使用 notify()、notifyAll() 才可以唤醒。