黑马程序员技术交流社区
标题:
【记录】代码练习-等待唤醒机制
[打印本页]
作者:
Kevin.Kang
时间:
2015-8-5 15:28
标题:
【记录】代码练习-等待唤醒机制
本帖最后由 Kevin.Kang 于 2015-8-5 15:32 编辑
如果是生产多个,和消费多个的话,两个线程需要加上同一把锁才行。
但是这样做依然还存在着问题:
1.如果消费者先抢到CPU执行权,消费数据,这时数据如果是空,就没有意义。
应该等着数据生产出来,再去消费,这样才具有意义。
2.如果生产者先抢到CPU执行权,生产数据,但是生产完一定数量的数据以后,还继续持有执行权,
它还会继续生产数据,这还现实情况不符,需要等着消费者把数据消费以后,再生产。
正常思路:
1.生产者
先看是否有数据,有就等待,没有就生产,生产完通知消费者消费
2.消费者
先看是否有数据,有就消费,没有就等待,消费完通知生产者生产
java提供了一个等待唤醒机制来解决这个问题。
等待唤醒.png
(9.1 KB, 下载次数: 1)
下载附件
2015-8-5 15:30 上传
作者:
Kevin.Kang
时间:
2015-8-5 16:22
* 等待唤醒:
* Object类中提供了三个方法:
* wait():等待
* notify():唤醒单个线程
* notifyAll():唤醒多个线程
* 为什么等待唤醒方法定义在Object类中:
* 这些方法都是通过锁对象进行调用的,锁对象可以是任意的
* 所以,这些方法必须定义在Object类中。
测试类:
package com.kxg_03;
public class StudentDemo {
public static void main(String[] args) {
// 创建资源
Student s = new Student();
// 创建SetThread和GetThread对象
SetThread st = new SetThread(s);
GetThread gt = new GetThread(s);
// 创建线程
Thread t1 = new Thread(st);
Thread t2 = new Thread(gt);
// 开启线程
t1.start();
t2.start();
}
}
复制代码
资源类:
package com.kxg_03;
/*
* 定义学生类
*/
public class Student {
String name;
int age;
boolean flag;// 用来判断是否存在资源,默认是flash,没有资源
}
复制代码
生产者类:
package com.kxg_03;
/*
* 设置学生信息的线程
*/
public class SetThread implements Runnable {
private Student s;
private int i;
public SetThread(Student s) {
this.s = s;
}
@Override
public void run() {
while (true) {
// 设置同步锁
synchronized (s) {
// 如果有数据,生产者等待
if (!s.flag) {
try {
s.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (i % 2 == 0) {
s.name = "小明";
s.age = 5;
} else {
s.name = "汪汪";
s.age = 2;
}
i++;
// 生产完成,把变量改为有数据
s.flag = false;
// 唤醒线程
s.notify();
}
}
}
}
复制代码
消费者类:
package com.kxg_03;
/*
* 设置获取学生信息的线程
*/
public class GetThread implements Runnable {
private Student s;
public GetThread(Student s) {
this.s = s;
}
@Override
public void run() {
while (true) {
// 设置同步锁
synchronized (s) {
// 如果没有数据,消费者就等待
if (s.flag) {
try {
s.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(s.name + ":" + s.age);
// 修改标记
s.flag = true;
// 唤醒线程
s.notify();
}
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2