网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
可签
7
级以上的吧
50
个
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月23日
漏签
0
天
java吧
关注:
1,295,525
贴子:
12,829,652
看贴
图片
吧主推荐
视频
游戏
18
回复贴,共
1
页
<返回java吧
>0< 加载中...
吧友们。这是怎么回事
只看楼主
收藏
回复
ajjxbxbne
淼淼水
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我想试一下在while循环里面使用wait结果我多次测试,永远只有一个消费者在运行。
送TA礼物
IP属地:浙江
1楼
2020-12-05 23:27
回复
大千有道
淼水
4
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
sync 啊
IP属地:天津
来自
iPhone客户端
2楼
2020-12-06 03:02
回复
收起回复
2026-01-23 09:56:13
广告
不感兴趣
开通SVIP免广告
大千有道
淼水
4
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
第二个线程在锁外面 第一个线程在锁里面出不来
IP属地:天津
来自
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
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
IP属地:天津
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)
收起回复
2026-01-23 09:50:13
广告
不感兴趣
开通SVIP免广告
观haiGou叫叫
淼淼沝
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
锁的都是自己 sleep在这里没什么用 如果担心线程安全用个原子类。sync决定了同一时间只能有一个在消费和生产 至于是哪个就看谁启动快了。记住notify会继续执行剩下的部分 你的生产者也在wait。还有锁对象应该改成竞争对象 要不然以后会出现逻辑问题 千万别竞争一个用的却是另一个。耦合该强的时候一定要强。至于为什么在线程池中线程二干不过线程一 谁也不清楚 说不定哪里抽风了 或者底层实现的小细节。可能换换位置多试几次就又变了。
IP属地:四川
来自
iPhone客户端
9楼
2020-12-11 11:58
回复
收起回复
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧热议榜
1
终末地外服炸了,随机清空余额
2988300
2
纯牛马?社畜加班猝死仍被催
2783884
3
教授神评:美国公平度碾压国内
2645552
4
员工陷离婚危机,老板开除获赞
2631474
5
出生率慢爬坡,8u投票支点招
1877278
6
终末地首日锐评:快跑or真香
1509350
7
奥斯卡提名出炉,《罪人》横扫局
1482120
8
拒吃软饭!电竞大佬硬甩富婆
1126954
9
聚会搞双标?男子直接离席不伺候
962940
10
懂王新活:盖疯人院强收流浪汉
862428
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示