开发者学堂课程【【名师课堂】Java 高级开发:【第 06 个代码模型】综合案例:生产者与消费者(解决重复操作问题)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/372/detail/4567
【第 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) { l
/已经生产了,所以不允许重复生产
try i
.super.wait(o; t等待执行
catch (InterruptedException e) i
e.printstackTrace(;
}
Thread.sleep(5e);
}catch (InterruptedException e) {
e.printstackTrace();
if (flag == false){ l/已经生产了,所以不允i
this.flag = false ; 1/表示已经生产过了,不允许再生产了
super.notify; 1/唤醒等待线程|
public synchronized void set(string title,string note) {
if (this.flag == false) i //广现在不允许取走
try i
super.wait(o;1/等待执行
}catch (InterruptedException e) f.e.printstackTrace(o;
this.title = title ;
try i
Thread.sleep(10);
}catch (InterruptedException e) i
e.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() 才可以唤醒。