线程同步运行结果每次都是一样的,为嘛?消费者与生产者问题 本帖最后由 c2c9ccc 于 2014-03-06 16:31:47 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 barsket.wait(); 只有这一行,当前线程才会释放 barsket 的同步锁(synchronized(barsket){})。 barsket.wait(); 是要等待另外一个线程完全操作完了才会执行的··· 一个sleep让那个 生产者sleep长点,可以吗? lass Message { private int bao = 0; private static final int temp = 7; public synchronized void setMessage() { if (this.bao > temp) { try { System.out.println("篮子装满包了"); super.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.bao++; if(this.bao==1){super.notify();} System.out.println(Thread.currentThread().getName() + ": 生产了一个包"); } public synchronized void getMessage() { if (bao <= 0) { try { System.out.println("篮子里没有包了"); super.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.bao--; if(this.bao==6){super.notify();} System.out.println(Thread.currentThread().getName() + "吃掉一个包,还剩:" + this.bao); }}class Producer implements Runnable { private Message mes; public Producer() { } public Producer(Message mes) { this.mes = mes; } public void run() { for (int i = 0; i < 20; i++) { if (i % 2 == 0) { mes.setMessage(); } else { mes.setMessage(); } } }}class Consumer implements Runnable { private Message mes; public Consumer() { } public Consumer(Message mes) { this.mes = mes; } @Override public void run() { // TODO 自动生成的方法存根 for (int i = 0; i < 20; i++) { mes.getMessage(); } }}public class TestProduceConsumer { public static void main(String[] args) { // TODO 自动生成的方法存根 Message mes = new Message(); Producer pro = new Producer(mes); Consumer com = new Consumer(mes); new Thread(pro, "A").start(); new Thread(pro, "B").start(); new Thread(com, "a").start(); new Thread(com, "b").start(); }}输出-----------------------------------------------B: 生产了一个包B: 生产了一个包B: 生产了一个包B: 生产了一个包B: 生产了一个包B: 生产了一个包B: 生产了一个包B: 生产了一个包篮子装满包了b吃掉一个包,还剩:7b吃掉一个包,还剩:6B: 生产了一个包B: 生产了一个包篮子装满包了b吃掉一个包,还剩:7b吃掉一个包,还剩:6B: 生产了一个包B: 生产了一个包篮子装满包了b吃掉一个包,还剩:7b吃掉一个包,还剩:6B: 生产了一个包B: 生产了一个包篮子装满包了b吃掉一个包,还剩:7b吃掉一个包,还剩:6B: 生产了一个包B: 生产了一个包篮子装满包了b吃掉一个包,还剩:7b吃掉一个包,还剩:6B: 生产了一个包B: 生产了一个包篮子装满包了b吃掉一个包,还剩:7b吃掉一个包,还剩:6B: 生产了一个包B: 生产了一个包b吃掉一个包,还剩:7b吃掉一个包,还剩:6b吃掉一个包,还剩:5b吃掉一个包,还剩:4b吃掉一个包,还剩:3b吃掉一个包,还剩:2b吃掉一个包,还剩:1b吃掉一个包,还剩:0A: 生产了一个包A: 生产了一个包A: 生产了一个包A: 生产了一个包A: 生产了一个包A: 生产了一个包A: 生产了一个包A: 生产了一个包篮子装满包了a吃掉一个包,还剩:7a吃掉一个包,还剩:6a吃掉一个包,还剩:5a吃掉一个包,还剩:4a吃掉一个包,还剩:3a吃掉一个包,还剩:2a吃掉一个包,还剩:1a吃掉一个包,还剩:0篮子里没有包了A: 生产了一个包A: 生产了一个包A: 生产了一个包A: 生产了一个包A: 生产了一个包A: 生产了一个包A: 生产了一个包A: 生产了一个包篮子装满包了a吃掉一个包,还剩:7a吃掉一个包,还剩:6a吃掉一个包,还剩:5a吃掉一个包,还剩:4a吃掉一个包,还剩:3a吃掉一个包,还剩:2a吃掉一个包,还剩:1a吃掉一个包,还剩:0篮子里没有包了A: 生产了一个包A: 生产了一个包A: 生产了一个包A: 生产了一个包a吃掉一个包,还剩:3a吃掉一个包,还剩:2a吃掉一个包,还剩:1a吃掉一个包,还剩:0刚学java,不知道对不对,求鉴定! 关于对象的问题 一个让人困扰的问题 小问题哦~ 关于 i ++; 求个学生信息管理系统。 问个关于jre的问题 求助了 一个最基础的问题!!! 请教一个内部类的问题: new A().super() 无法重载父窗口中的按扭事件? 比较问题一道,关于 == 请教一个Swing的技术问题. 小弟初试java泛型遭遇编译错误,求前辈帮助指点,不胜感谢
private int bao = 0;
private static final int temp = 7; public synchronized void setMessage() {
if (this.bao > temp) {
try {
System.out.println("篮子装满包了");
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.bao++;
if(this.bao==1){super.notify();}
System.out.println(Thread.currentThread().getName() + ": 生产了一个包");
} public synchronized void getMessage() {
if (bao <= 0) {
try {
System.out.println("篮子里没有包了");
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.bao--;
if(this.bao==6){super.notify();}
System.out.println(Thread.currentThread().getName() + "吃掉一个包,还剩:"
+ this.bao);
}
}class Producer implements Runnable {
private Message mes; public Producer() {
} public Producer(Message mes) {
this.mes = mes;
} public void run() {
for (int i = 0; i < 20; i++) {
if (i % 2 == 0) {
mes.setMessage();
} else {
mes.setMessage();
}
}
}
}class Consumer implements Runnable {
private Message mes; public Consumer() {
} public Consumer(Message mes) {
this.mes = mes;
} @Override
public void run() {
// TODO 自动生成的方法存根
for (int i = 0; i < 20; i++) {
mes.getMessage();
}
}
}public class TestProduceConsumer { public static void main(String[] args) {
// TODO 自动生成的方法存根
Message mes = new Message();
Producer pro = new Producer(mes);
Consumer com = new Consumer(mes);
new Thread(pro, "A").start();
new Thread(pro, "B").start();
new Thread(com, "a").start();
new Thread(com, "b").start();
}}
输出-----------------------------------------------
B: 生产了一个包
B: 生产了一个包
B: 生产了一个包
B: 生产了一个包
B: 生产了一个包
B: 生产了一个包
B: 生产了一个包
B: 生产了一个包
篮子装满包了
b吃掉一个包,还剩:7
b吃掉一个包,还剩:6
B: 生产了一个包
B: 生产了一个包
篮子装满包了
b吃掉一个包,还剩:7
b吃掉一个包,还剩:6
B: 生产了一个包
B: 生产了一个包
篮子装满包了
b吃掉一个包,还剩:7
b吃掉一个包,还剩:6
B: 生产了一个包
B: 生产了一个包
篮子装满包了
b吃掉一个包,还剩:7
b吃掉一个包,还剩:6
B: 生产了一个包
B: 生产了一个包
篮子装满包了
b吃掉一个包,还剩:7
b吃掉一个包,还剩:6
B: 生产了一个包
B: 生产了一个包
篮子装满包了
b吃掉一个包,还剩:7
b吃掉一个包,还剩:6
B: 生产了一个包
B: 生产了一个包
b吃掉一个包,还剩:7
b吃掉一个包,还剩:6
b吃掉一个包,还剩:5
b吃掉一个包,还剩:4
b吃掉一个包,还剩:3
b吃掉一个包,还剩:2
b吃掉一个包,还剩:1
b吃掉一个包,还剩:0
A: 生产了一个包
A: 生产了一个包
A: 生产了一个包
A: 生产了一个包
A: 生产了一个包
A: 生产了一个包
A: 生产了一个包
A: 生产了一个包
篮子装满包了
a吃掉一个包,还剩:7
a吃掉一个包,还剩:6
a吃掉一个包,还剩:5
a吃掉一个包,还剩:4
a吃掉一个包,还剩:3
a吃掉一个包,还剩:2
a吃掉一个包,还剩:1
a吃掉一个包,还剩:0
篮子里没有包了
A: 生产了一个包
A: 生产了一个包
A: 生产了一个包
A: 生产了一个包
A: 生产了一个包
A: 生产了一个包
A: 生产了一个包
A: 生产了一个包
篮子装满包了
a吃掉一个包,还剩:7
a吃掉一个包,还剩:6
a吃掉一个包,还剩:5
a吃掉一个包,还剩:4
a吃掉一个包,还剩:3
a吃掉一个包,还剩:2
a吃掉一个包,还剩:1
a吃掉一个包,还剩:0
篮子里没有包了
A: 生产了一个包
A: 生产了一个包
A: 生产了一个包
A: 生产了一个包
a吃掉一个包,还剩:3
a吃掉一个包,还剩:2
a吃掉一个包,还剩:1
a吃掉一个包,还剩:0
刚学java,不知道对不对,求鉴定!