线程与多个对象同步

时间:2013-04-10 11:37:34

标签: multithreading producer-consumer thread-synchronization

我多年来一直面临这个问题,请帮帮我。我正在使用线程同步实现生产者 - 消费者示例。我在这个传统的计划中做了一些改变。我没有使用一个队列对象,而是使用了两个Queue对象。但是程序没有工作..(PS-我知道我可以通过只使用一个队列对象来使这个程序工作,但是如果我想使用两个队列对象呢?)

类队列{

static int value;

static boolean valueSet = false;

public static final Object obj;

static {

    obj = new Object();
}


void push() {

    synchronized(Queue.obj) {

        while( Queue.valueSet ) {

            try {
            Thread.sleep(1000);
            }catch(Exception e) {}
        }

        System.out.print("\n\n Push:-  " + (++(Queue.value)));
        Queue.valueSet = true;

        return;

    }

}

void pop() {

    synchronized(Queue.obj) {

        while(!(Queue.valueSet)) {

            try {
            Thread.sleep(1000);
            }catch(Exception e) {}
        }

        System.out.print("\n\n Pop:-   " + Queue.value);

        Queue.valueSet = false;

        return;

    }

}

}

class Producer实现了Runnable {

Queue Q;
Thread P;


Producer(Queue Q) {

    this.Q = Q;
    P = new Thread(this);
    P.start();

}

public void run() {

    while(true) {

        Q.push();

    }
}

}

class Consumer实现Runnable {

Queue Q;
Thread C;

Consumer(Queue Q) {

    this.Q = Q;
    C = new Thread(this);
    C.start();


}

public void run() {

    while(true) {

        Q.pop();

    }
}

}

公共类TestQueue {

public static void main(String[] args) {

    Queue Q1 = new Queue();
    Queue Q2 = new Queue();

    Object obj = new Object();


    Producer p = new Producer(Q1);
    Consumer c = new Consumer(Q2);
}

}

1 个答案:

答案 0 :(得分:0)

我得到了答案。我的误解是wait,notify和notifyall方法属于线程类。所以我在线程对象上调用它们。

解决方案是在线程以外的共享静态对象上调用wait和notify方法。

答案: -

类队列{

static int value;

static boolean valueSet = false;

public static final Object obj;

static {

    obj = new Object();
}


void push() {

    synchronized(Queue.obj) {

        while( Queue.valueSet ) {

            try {
            Queue.obj.wait();
            Thread.sleep(1000);
            }catch(Exception e) {

                e.printStackTrace();
            }
        }

        System.out.print("\n\n Push:-  " + (++(Queue.value)));
        Queue.valueSet = true;
        Queue.obj.notify();
    }

}

void pop() {

    synchronized(Queue.obj) {

        while(!(Queue.valueSet)) {

            try {
            Queue.obj.wait();
                Thread.sleep(1000);
            }catch(Exception e) {

                e.printStackTrace();
            }
        }

        System.out.print("\n\n Pop:-   " + Queue.value);

        Queue.valueSet = false;
        Queue.obj.notify();
    }

}

}

class Producer实现了Runnable {

Queue Q;
Thread P;


Producer(Queue Q) {

    this.Q = Q;
    P = new Thread(this);
    P.start();

}

public void run() {

    while(true) {

        Q.push();

    }
}

}

class Consumer实现Runnable {

Queue Q;
Thread C;

Consumer(Queue Q) {

    this.Q = Q;
    C = new Thread(this);
    C.start();


}

public void run() {

    while(true) {

        Q.pop();

    }
}

}

公共类TestQueue {

public static void main(String[] args) {

    Queue Q1 = new Queue();
    Queue Q2 = new Queue();

    Producer p = new Producer(Q1);
    Consumer c = new Consumer(Q2);
}

}