class productor extends Thread{
    Integer product;
    productor(Integer product){
        this.product = product;
    }    public  void run(){
        synchronized(product){
            for(int i = 0;i < 5;i++){
                product++;
                System.out.println("The product is:" + product);
                product.notify();
                try{
                    product.wait();
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
            product.notify();
        }
    }
}
class Consumer extends Thread{
    Integer consumer;
    Consumer(Integer consumer){
        this.consumer = consumer;
    }
    public  void run(){
        synchronized(consumer){
            for(int i = 0;i < 5;i++){
                System.out.println("The consumer is:" + consumer);
                consumer.notify();
                try{
                    consumer.wait();
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
            consumer.notify();
        }
    }
}
public class test{
    public static void main(String args[])
    {
        Integer i = new Integer(5);
        new productor(i).start();
        new Consumer(i).start();
    }
}
在执行时,总是会报java.lang.IllegalMonitorStateException: current thread not owner请各位高手指点一下

解决方案 »

  1.   

    两个 synchronized()  对象不是同一个
      

  2.   

    public class ThreadTest {
    public static void main(String args[]) {
    Tickets i = new Tickets(10);
    new Productor(i).start();
    new Consumer(i).start();
    }
    }class Tickets {
    int number = 0;//票号. int size;//总数. boolean available = false; public Tickets(int size) {
    this.size = size;
    }
    }class Productor extends Thread {
    Tickets productor=null; Productor(Tickets productor) {
    this.productor = productor;
    } public void run() {

                while(productor.number<productor.size){
    synchronized(productor)
    {
    System.out.println("The product is:" + (++productor.number));
    productor.available = true;
    }

                }

    }
    }class Consumer extends Thread {
    Tickets consumer = null; int i=0; Consumer(Tickets consumer) {
    this.consumer = consumer;
    } public void run() {

      while(i<consumer.size){
       synchronized(consumer)
      {
    if (consumer.available==true&&i<=consumer.number)
    System.out.println("The consumer is:" + (++i));
    if (i == consumer.size)
    try{sleep(1);}catch(Exception e){}
    consumer.available = false;
      }
    }
    }
    }