java实现生产者-消费者

1213333 2014-03-01 07:54:39
class Message {
private String title;
private String content;
private boolean flag = true;

public synchronized void set(String title, String content) {
if (flag == false) {
try {
super.wait();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
else{
this.title = title;
this.content = content;}
this.flag = false;
super.notify();
}

public synchronized void get() {
if (flag == true) {
try {
super.wait();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
else{
System.out.println(this.title + "---->" + this.content);}
this.flag = true;
super.notify();
}
}

class Producer implements Runnable { // 定义生产者
private Message mes = null;

public Producer(Message mes) {
this.mes = mes;
}

public void run() {
for (int i = 0; i < 20; i++) {
if (i % 2 == 0) {
this.mes.set("**", "学习java");
} else {
this.mes.set("**", "学习C++");
}
}
}
}

class Consumer implements Runnable { // 定义消费者
private Message com = null;

public Consumer(Message com) {
this.com = com;
}

public void run() {
for (int i = 0; i < 20; i++) {
this.com.get();
}
}
}

public class ProducerConsumer {
public static void main(String[] args) throws Exception {
Message msg = new Message(); // 定义Message对象,用于保存和取出数据
new Thread(new Producer(msg)).start(); // 启动生产者线程
new Thread(new Consumer(msg)).start(); // 取得消费者线程
}
}
为什么加了这else就不行啊?去掉任意一个或全去掉就行啊,
谢谢啦。
...全文
394 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kevinlifeng 2014-03-03
  • 打赏
  • 举报
回复
我运行了一下你的代码,有两个else的时候,不是死锁问题。虽然只运行打印出一条语句,可是程序运行完了,没有死锁。你的程序是这样运行的1.先生产者运行了第一个else{}因为flag=true,当执行完else块。flag=false的时候,这个时候,for()又调用set方法,这个时候就进入了set的if(){}块中,这个时候就等待线程来唤醒它。而且它已经释放资源。这个时候,get方法得到资源,执行这个时候flag=false的,这个没有异议吧!!这个时候,就就打印了一条记录出来了。然后就执行了flag=true的赋值,这个大家没有什么异议吧。不过问题就来了,super.nofity()大家以为这样就唤醒了生产者的set里面那个中断在if(){}块中的的那个线程,的确他是唤醒了它,可是,他还没有得到cpu的资源,所以他还要等一段时间。这个时候,get()又被执行了一次,这个时候flag=true的,这个大家可以理解吧!所以就会在get()方法的if(){}块中中断消费。这个时候,set里面的方法才被唤醒,然后执行flag=flag操作而且也nofity(),notify()方法和刚才的一样,是会唤醒消费者的get()块中中断的在if()块的方法,但是,他没有那么快得到资源,所以线程还是在继续调用set方法,这个时候flag=false,没有意见吧,这个时候,又在set的if()块中中断线程,这个时候。消费者终于得到资源,等了老半天,然后执行在if()块中中断段的程序,然后又执行了flag=true的操作,然后有nofity(),记得nofity()是唤醒了线程,不过线程还要得到资源。所以for在调用get的方法的时候,flag=true,然后就是继续中断消费者。希望对你有帮助。多看几遍,就明白我的意思了。谢谢
coolbamboo2008 2014-03-02
  • 打赏
  • 举报
回复
楼上的正解 多线程阻塞的时候就一定要想到唤醒
灰太狼A代 2014-03-02
  • 打赏
  • 举报
回复
楼上正解啊 和和
Tonny_wxm 2014-03-01
  • 打赏
  • 举报
回复
两个都加上 直接阻塞了当前线程 没人唤醒这个线程了
乔不思 2014-03-01
  • 打赏
  • 举报
回复
两个 都加上 就 死了。。。是不是? 没有唤醒其他进程
数据集可视化效果可参见下方展示。 【数据集概况】 · 检测类别(中文):[保龄球(bowling)] · 训练集:594 张 · 验证集:75 张 · 测试集:74 张 · 总计:743 张 该数据集聚焦于室内保龄球馆场景,系统性采集了多角度、多姿态下保龄球在不同运动阶段的视觉特征,为保龄球运动过程中的球体识别与轨迹分析提供了高质量标注样本,具有明确的体育训练与智能辅助系统开发价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 100 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9938** mAP50-95 | 0.6966 Precision | 0.9740 Recall | 0.9974 train/box_loss | 0.9113 train/cls_loss | 0.2862 val/box_loss | 1.1516 val/cls_loss | 0.3116 【训练过程分析】 100 轮训练后 mAP50 达到 0.9938,模型收敛良好。Loss 曲线前段快速下降,后段趋于平稳,val_loss 无反弹,没有明显过拟合。但 mAP50-95 为 0.6966,和 mAP50 差距 0.30,定位精度仍有优化空间。 【模型性能评估】 Precision 0.9740、Recall 0.9974,精召双高,模型对保龄球的检测能力强。 【预测效果展示】 验证集预测效果较好,检测框基本准确覆盖保龄球,置信度整体偏高。 【改进建议】 1. 丰富场景多样性:补充不同光照、背景和遮挡条件下的样本。 2. 提升输入分辨率:640 ...
PaddleOCR 与YOLO目标检测 HTTP 服务。 项目通过 PaddleOCROnnx 原生库集成 OnnxRuntime加速能力,围绕 ONNX 模型部署, 以统一接口提供图像文字识别、YOLO 目标检测和 Tensor 数据输出。 功能概览 文字识别:支持图片 Base64、multipart/form-data 上传,以及文本和 JSON 结果。 目标检测:支持 YOLO 图片检测,返回检测框 JSON 或原始 Tensor。 浏览器演示:访问服务根地址,上传图片并切换 OCR、YOLO 模式。 健康检查:通过 /health 查看服务及 OCR、YOLO 引擎初始化状态。 并发处理:通过 OCR 引擎实例池处理并发请求,可调整实例数量。 体验与调用 启动后访问: 入口 地址 浏览器演示 http://localhost:5000/ 健康检查 http://localhost:5000/health 原生依赖 Windows:优先从 runtimes/win-x64/native/ 加载原生 DLL;该目录没有 PaddleOCROnnx.dll 时,尝试从可执行文件所在目录加载。主 DLL 与对应后端依赖应放在同一原生目录中,不要将同一组依赖分散到多个目录。 Linux:原生运行时位于 runtimes/linux-x64/native/,程序使用相对于可执行文件的运行时搜索路径查找随包部署的依赖。 后端选择:CoreOCROnnx 支持 ONNX Runtime、OpenVINO、TensorRT 后端。请使用与平台、进程架构、硬件和后端匹配的一整套运行时,不要混用不同后端或版本的依赖。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧