62,614
社区成员
发帖
与我相关
我的任务
分享
while (true) {
Object obj = null; // 待处理对象
synchronized (pool ) {
if (pool .size() >= 1) {
obj = pool.get(0); // 对象池中提取一个待处理对象.例如list就是remove(0)
} else {
obj = null;
}
}
if (obj == null) {
Thread.sleep(10); // 如果没有, 则会暂停一会儿. 统一为10ms
} else {
doSomething(obj); // 处理这个对象
}
}
synchronized (pool ) {
pool .add(object); // 塞入一个待处理的对象.
}
while (true) {
Object obj = null;
synchronized (pool ) {
while (pool .size() <= 0) { // 注意这里必须用while而不能用if 判断,否则会产生所谓的 虚假唤醒 (spurious wakeup)。
pool .wait(); // 等待通知
}
obj = pool .get(0);
}
doSomething(obj); // 如果不放心这里还可以为空判断, 但是理论上应该不可能出现.(pool中没有空对象的话)
}
synchronized (pool ) {
pool .add(input);
pool .notify(); // 唤醒等待的线程
}
static final Pool pool // 需要同步访问的共享资源
// 生产者代码
… produce() {
while(true) {
synchronized(pool ){
pool.add(object) // 产生一些东西,放到 pool 共享资源中
pool .notify(); //然后通知消费者
pool .wait(); // 然后自己进入pool待召队列
}
}
}
// 消费者代码
… consume() {
while(true) {
synchronized(pool ){
while(condition is notTrue){ // 必须使用while判断条件是否满足.
pool .wait(); // 进入pool 待召队列,等待生产者的通知
}
// 读取pool 共享资源里面的东西并做一些逻辑处理操作
pool .getObject();
pool .notify(); // 然后通知生产者
}
}
}