日期:2014-05-20 浏览次数:20801 次
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--”是非并发安全的,当然这是另一个话题。