网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
可签
7
级以上的吧
50
个
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
04月17日
漏签
0
天
java吧
关注:
1,255,245
贴子:
12,744,657
看贴
图片
吧主推荐
视频
游戏
18
回复贴,共
1
页
<返回java吧
>0< 加载中...
吧友们。这是怎么回事
只看楼主
收藏
回复
ajjxbxbne
淼淼水
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我想试一下在while循环里面使用wait结果我多次测试,永远只有一个消费者在运行。
送TA礼物
IP属地:浙江
1楼
2020-12-05 23:27
回复
大千有道
淼水
4
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
sync 啊
来自
iPhone客户端
2楼
2020-12-06 03:02
回复
收起回复
武汉市积墨智能科技
java
项目毕业论文-你还在为毕业论文而苦恼吗,积墨模型3分钟帮你搞定,专精模型,基于DS微调,包过查重、AIGC
2025-04-17 05:48
广告
立即查看
大千有道
淼水
4
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
第二个线程在锁外面 第一个线程在锁里面出不来
来自
iPhone客户端
3楼
2020-12-06 03:02
回复(3)
收起回复
ajjxbxbne
淼淼水
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
class Factory{
private int goods = 0;
public synchronized void produce() {
// System.out.println(Thread.currentThread() + ":first produce");
while (true){
if (goods < 1) {
goods++;
System.out.println("生产者:" + Thread.currentThread().getName() + "生产了1个商品,现在有" + goods + "个商品");
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
notifyAll();
} else {
try {
// System.out.println(Thread.currentThread() + ":wait");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public synchronized void consume() {
// System.out.println(Thread.currentThread() + ":first consume");
while (true){
if (goods > 0) {
goods--;
System.out.println("消费者:" + Thread.currentThread().getName() + "消费了1个商品,现在有" + goods + "个商品");
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
notifyAll();
} else {
try {
System.out.println(Thread.currentThread() + ":wait");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class Producer extends Thread{
private Factory factory;
public Producer(Factory factory){
this.factory = factory;
}
@Override
public void run() {
System.out.println(this + "生产者" + getName() + "开始生产");
// while (true) {
factory.produce();
// }
}
}
class Consumer extends Thread{
private Factory factory;
public Consumer(Factory factory){
this.factory = factory;
}
@Override
public void run() {
System.out.println(this + "消费者" + getName() + "开始消费");
// while (true) {
factory.consume();
// }
}
}
public class FactoryTest {
public static void main(String[] args) {
Factory factory = new Factory();
Producer producer = new Producer(factory);
producer.setName("1");
Consumer consumer = new Consumer(factory);
consumer.setName("2");
Consumer consumer2 = new Consumer(factory);
consumer2.setName("3");
producer.start();
consumer2.start();
consumer.start();
}
}
IP属地:浙江
4楼
2020-12-07 12:03
回复(4)
收起回复
大千有道
淼水
4
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
5楼
2020-12-07 13:36
回复
收起回复
xl619569096
淼淼淼淼
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
你生产者里判断goods < 1,岂不是生产者每生产一个就不会再生产了么, 只能等待消费者消费后唤醒才能生产下一个
IP属地:中国香港
6楼
2020-12-07 14:04
回复(1)
收起回复
一天阿
淼沝
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
779518836(JAVA学习讨论裙)
IP属地:浙江
7楼
2020-12-07 14:24
回复
收起回复
贴吧用户_QPJbSEC
淼淼沝
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
这都不会你还好意思说自己的程序员?赶紧滚回工地搬砖吧
8楼
2020-12-09 18:56
回复(2)
收起回复
观haiGou叫叫
淼淼沝
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
锁的都是自己 sleep在这里没什么用 如果担心线程安全用个原子类。sync决定了同一时间只能有一个在消费和生产 至于是哪个就看谁启动快了。记住notify会继续执行剩下的部分 你的生产者也在wait。还有锁对象应该改成竞争对象 要不然以后会出现逻辑问题 千万别竞争一个用的却是另一个。耦合该强的时候一定要强。至于为什么在线程池中线程二干不过线程一 谁也不清楚 说不定哪里抽风了 或者底层实现的小细节。可能换换位置多试几次就又变了。
IP属地:四川
来自
iPhone客户端
9楼
2020-12-11 11:58
回复
收起回复
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧热议榜
1
游戏王漫展群不让聊打牌?
2909370
2
ICU病床父亲最后笔画求破译遗言
2894403
3
TES让一追二战胜WE
2867620
4
美国没活了?对华关税又接着上升
2621700
5
王者荣耀联动哪吒2
2125500
6
IG投资人张总开团朱开
1528825
7
耳机吧惊现撒旦
1461504
8
女友把爱豆当宝把我当成草
989098
9
又到了崩铁水温吐槽环节
737352
10
s1mon事件反转对EDG彻底无感
629280
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示