【问题标题】:Thread synchronization with multiple objects与多个对象的线程同步
【发布时间】:2013-04-02 05:32:56
【问题描述】:

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

    }

}

}

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

    }
}

}

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

}

【问题讨论】:

    标签: multithreading producer-consumer thread-synchronization


    【解决方案1】:

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

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

    答案:-

    类队列{

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

    }

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

    }

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

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-11
      • 2016-05-03
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多