2 回答
TA贡献1827条经验 获得超7个赞
当您从生产者线程调用BUFFER.notify()时,使用者线程将被唤醒,并将尝试获取Buffer对象上的锁定。但是生产者线程仍然有缓冲区对象的锁(所以消费者必须等待它被释放)。当生产者满足条件时,它将释放缓冲区对象上的锁。这一次,使用者将获取锁并消耗缓冲区。直到它满足条件并释放锁。while(BUFFER.size() == 10)
while(BUFFER.isEmpty())
仅供参考;使用 LinkedBlockingQueue 类,可以在不使用锁的情况下编写生产者-消费者(如果为队列提供容量,则当容量已满时,生产者线程将被阻塞。当队列中没有项目时,使用者线程将被阻止。
TA贡献1784条经验 获得超2个赞
创建器在同步块内处于休眠状态。
请尝试以下操作:
Runnable producer = (() -> {
while(true) {
synchronized (BUFFER) {
try {
while(BUFFER.size() == 10) {
BUFFER.wait();
}
Random random = new Random();
System.out.println("producing "+BUFFER.offer(random.nextInt()));
BUFFER.notify();
} catch (Exception e) {
}
}
TimeUnit.SECONDS.sleep(1);
}
});
对消费者进行相同的修改。
添加回答
举报