解决方案 »

  1.   

    sleep时线程没有放开锁,要用wait才行。
    代码改为:
    class Web12306 implements Runnable {
    int Num = 20;
    private boolean flag = true;
    public  synchronized void run() {
    while (flag) {
    if (Num <= 0) {
    flag = false;
    return;
    }
    System.out.println(Thread.currentThread().getName() + "抢到了" + Num--);
    try {
    wait(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }
    public class SynDemo1 {
    public static void main(String[] args) {
    // 创建真实角色
    Web12306 web = new Web12306();
    // 创建代理角色
    Thread t1 = new Thread(web, "黄牛A");
    Thread t2 = new Thread(web, "路人甲");
    Thread t3 = new Thread(web, "某某乙");
    // 通过代理角色调用start()
    t1.start();
    t2.start();
    t3.start();
    }
    }
      

  2.   

    请问一下我是不是sleep里面不应该写一个常数1000?应该每个线程都写一个随机数?
      

  3.   

    @lz:不是啊,问题不是sleep多久,因为不管sleep多久,先进去的那个线程都会抱着锁睡觉,而不会放开锁,所以一直都是他一个人在运行,其他线程都没机会进去(没有锁进不去啊),所以应该改为wait方法,这个方法在等待是会放开锁,其他人才进的来。
    ps:sleep是Thread的方法,wait是Object的方法,lz可以查一下这两个方法的比较。
      

  4.   


    绝对木有鄙视
    我只是一看觉着这个程序应该都无法运行,不过你后面修改了
    你这个一个线程进去后就占有一直没释放其他的肯定是进去不了的
    你老师说是sleep的问题,我一下子就不敢出声了
      

  5.   

    很正常,你的循环位置放错了,将你的同步方法给成同步代码块,放在while循环里面,就不会出现只有黄牛A在抢票的情况了,之前的同步方法,一旦进入,你的线程其实一致在占据着锁,而且还是一直在while循环当中,sleep只失去执行权和执行资格,但是没有释放所,其他线程都进不来
      

  6.   

    看你这名字取得,抢票当然是黄牛党的活啦
    以上纯属开玩笑,我觉得不用sleep也可以的,现在的CPU应该起码都是双核4线程吧,所以无觉得不用sleep