日期:2014-05-20 浏览次数:20959 次
public class Table {
int beans = 20;
public synchronized int getBean(){//加同步锁住beans
if (beans == 0){
throw new RuntimeException("没了!");
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return beans--;
}
class Person extends Thread {
public void run() {
while (true) {
int bean = getBean();
System.out.println(this.getName() + "吃了" + bean);
Thread.yield();
}
}
}
public static void main(String[] args) {
Table table = new Table();
Person p1 = table.new Person();
Person p2 = table.new Person();
p1.start();
p2.start();
}
}
------解决方案--------------------
不是“从-45465165,一个很大的负数开始”
而是因为速度太快,一下子就刷屏把前面刷没了吧。
你把:
while (true) {
int bean = getBean();
System.out.println(getName() + "吃了" + bean);
Thread.yield();
}
修改为:
for (int i = 0;i < 50; i++) { // 控制下循环规模,不要无限制循环
int bean = getBean();
System.out.println(getName() + "吃了" + bean);
Thread.yield();
}
不过你这个程序本身“beans--”是非并发安全的,当然这是另一个话题。