本帖最后由 cloudeagle_bupt 于 2013-06-06 17:51:35 编辑

解决方案 »

  1.   

    这个程序没有错,main方法先它运行5个线程,由于slot.slotNum == 0,均等待,直到
      Producer p = new Producer(s); 
            p.start(); 运行
    synchronized (slot) {                 while (slot.slotNum == 20)                     slot.wait();                             slot.produce();             slot.notifyAll();             System.out.println("Thread " + this.getName() + " producing ! slotNum is " + slot.slotNum+"\n");               } 
    slot.produce(); 这儿slot.slotNum == 1,
     slot.notifyAll唤醒所有线程,
    打印System.out.println("Thread " + this.getName() + " producing ! slotNum is " + slot.slotNum+"\n");该 线程结束,
    其中thread4抢到资源,线程4运行完slot.slotNum == 0,其他线程继续等待
    最终原因你只生参了一个产品,消费共有五个线程,一个运行晚还有4个。自然是等待
      

  2.   

    不建议用优先级。因为有些语言不支持1到10的。notify是随机唤醒的,要想唤醒特定的线程,设置相应的bool值变量。
      

  3.   


      能举个例子么?  这里我一直不明白的是,如何才能得到当前的唤醒线程呢? 或者说,怎么去判断哪个线程被唤醒了? 我用的办法是设置全局变量,f1到fn,初始为false,想唤醒那个就把对应的f值设为true。然后判断一下好了。貌似也只适合用线程比较少的情况。多个线程应该用线程池比较好。