0

这个问题困扰我好几天了,求大神帮忙。我正在使用线程同步实现生产者-消费者示例。我在这个传统的节目中做了一些改变。我没有只使用一个队列对象,而是使用了两个队列对象。但是程序不工作..(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;

    }

}

}

类生产者实现 Runnable {

Queue Q;
Thread P;


Producer(Queue Q) {

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

}

public void run() {

    while(true) {

        Q.push();

    }
}

}

类消费者实现可运行{

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);
}

}

4

1 回答 1

0

我得到了答案。我的误解是等待、通知和通知所有方法都是线程类的。所以我在线程对象上调用它们。

解决方案是仅在线程以外的共享静态对象上调用等待和通知方法。

回答:-

类队列{

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();
    }

}

}

类生产者实现 Runnable {

Queue Q;
Thread P;


Producer(Queue Q) {

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

}

public void run() {

    while(true) {

        Q.push();

    }
}

}

类消费者实现可运行{

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);
}

}

于 2013-04-16T11:21:56.517 回答