- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个使用ReentrantLock
而不是生产者和消费者问题的synchronized
的小程序。但是程序被卡住了,因为一旦消费了生产的商品,消费线程将停止并且永远不会恢复消费。
程式码片段:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Mantou2 {
int id;
public Mantou2(int id) {
this.id = id;
}}
class Basket2 {
final int max = 20;
Mantou2[] ms;
int n;
Lock lock;
Condition full;
Condition empty;
public Basket2() {
ms = new Mantou2[max];
n = 0;
lock = new ReentrantLock();
full = lock.newCondition();
empty = lock.newCondition();
}
public void consume() {
lock.lock();
try {
while (n == 0) {
System.out.println("No Mantou left!");
empty.await();
}
empty.signal();
System.out.println(ms[--n].id + " consumed and " + n + " left");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void produce() {
lock.lock();
try {
while (n == max) {
System.out.println("Inventory is full!");
full.await();
}
full.signal();
ms[n] = new Mantou2(n++);
System.out.println(ms[n - 1].id + " produced and " + n + " left");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}}
class Consumer2 implements Runnable {
Basket2 basket;
public Consumer2(Basket2 basket) {
this.basket = basket;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 50; i++) {
basket.consume();
try {
Thread.sleep((long) (Math.random() * 300));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}}
class Producer2 implements Runnable {
Basket2 basket;
public Producer2(Basket2 basket) {
this.basket = basket;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 50; i++) {
basket.produce();
try {
Thread.sleep((long) (Math.random() * 300));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}}
public class ProducerCustomer2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Basket2 basket = new Basket2();
Producer2 producer = new Producer2(basket);
Consumer2 consumer = new Consumer2(basket);
Thread p = new Thread(producer);
Thread c = new Thread(consumer);
p.start();
c.start();
}}
最佳答案
好的,您忘了做两件事:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.ArrayList;
public class ProducerCustomer2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ProducerCustomer2 pc = new ProducerCustomer2();
pc.start();
}
public void start() {
Basket2 basket = new Basket2();
Producer2 producer = new Producer2(basket);
Consumer2 consumer = new Consumer2(basket);
Thread p = new Thread(producer);
Thread c = new Thread(consumer);
p.start();
c.start();
}
private class Mantou2 {
int id;
public Mantou2(int id) {
this.id = id;
}
}
private class Basket2 {
final int max = 20;
ArrayList<Mantou2> ms;
int n;
Lock lock;
Condition full;
Condition empty;
public Basket2() {
ms = new ArrayList<Mantou2>();
n = 0;
lock = new ReentrantLock();
full = lock.newCondition();
empty = lock.newCondition();
}
public void consume() {
lock.lock();
try {
while (n == 0) {
System.out.println("No Mantou left!");
full.await();
}
System.out.println(ms.get(n-1).id + " consumed and " + n + " left");
ms.remove(n-1);
n--;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
full.signal();
lock.unlock();
}
}
public void produce() {
lock.lock();
try {
while (n == max) {
System.out.println("Inventory is full!");
full.await();
}
n++;
ms.add(new Mantou2(n));
System.out.println(ms.get(n-1).id + " produced and " + n + " left");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
full.signal();
lock.unlock();
}
}
}
private class Consumer2 implements Runnable {
Basket2 basket;
public Consumer2(Basket2 basket) {
this.basket = basket;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 50; i++) {
basket.consume();
try {
Thread.sleep((long) (Math.random() * 300));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private class Producer2 implements Runnable {
Basket2 basket;
public Producer2(Basket2 basket) {
this.basket = basket;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 50; i++) {
basket.produce();
try {
Thread.sleep((long) (Math.random() * 300));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
关于java - Java线程生产者和使用者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39715500/
我正在尝试使用包含 XPath 的选择器订阅 WebLogic JMS 消息。在 WebLogic 中,它是使用“JMS_BEA_SELECT”函数实现的。像这样的东西: session.creat
我想使用 sage 和外部 c 库。外部库已经具有用 cython 编写的 python 绑定(bind),并处理 python 的数字类和 gmp 整数之间的转换。 为了使其能够与 sage 一起使
我已经能够成功地使用 logman 来转储一些内核跟踪。但是,我希望能够以编程方式在我的应用程序中启用内核事件的实时消耗(主要是线程/进程创建/删除和文件 I/O)。完成此任务的最佳方法是什么? 最佳
我想在 FreeBSD 10.1 上编写一个 C 程序,使用 libdtrace 实现 DTrace 消费者。 我知道我需要先调用 dtrace_open() - 例如我找到了 this旧演示文稿,但
我正在尝试使用消息队列 (RabbitMQ) 在基于微服务的架构中处理请求授权。 根据这些 instructions,我已经将接收器和发送器配置为 .NET Core 中的控制台应用程序.但是,在实际
我遇到了一个场景,我必须让一个基于 Axis2 的 ws 消费者在 WebMethods 中作为 java 服务工作。我首先在 netbeans 中实现了 ws Consumer 只是为了看看它是否有
据我所知,Lambdas 用于监听事件并运行一段代码来响应这些事件。 事件必须是 AWS 服务或 HTTP 端点。 如果我有一个 RabbitMq 运行在 上的服务EC2 服务器 (不使用 SQS),
所以我正在构建一个使用 Ruby on Rails 前端和 Java 后端的 Web 应用程序。因此,基本上,当用户登录网站时,我希望在屏幕上显示该用户的所有交易数据历史记录的列表。 我需要执行此操作
我已经实现了一个 Java Servlet 过滤器,它使用 PF 提供的 Java API 从 PingFederate (PF) 服务器消耗 token 。这使得我的应用程序能够在 PF SSO 设
我有一个 WCF SOAP 使用者,它由 Visual Studio 2012 从 WSDL 实现。 WSDL 由 PeopleTools 生成。基础对象的类型为 System.ServiceMode
Oauth2 快把我逼疯了。 目前,我的 Rails 应用程序通过 Facebook 和其他 Oauth2 提供商对用户进行身份验证,这要归功于 Devise 和 OmniAuth 的美妙之处。用户无
我想获得一些关于在 Chrome 扩展和 Gmail 小工具中正确处理 Salesforce OAuth 消费者 key 和 secret 的想法。 Chrome 扩展程序本质上是用 zip 兼容格式
我正在使用 Express、Node 和 Google Drive API。我正在尝试使用 PDF 文件的 blob 响应对我的端点的 API 调用。但是当我从 Drive API 获取文件时我不想保
我是一名优秀的程序员,十分优秀!