当前位置: 首页 > 知识库问答 >
问题:

与多个对象的线程同步

邓越泽
2023-03-14

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

    }
}

}

公共类测试队列{

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个答案

牛昱
2023-03-14

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

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

答复:-

类队列{

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

    }
}

}

公共类测试队列{

public static void main(String[] args) {

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

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

}

 类似资料:
  • 现在我的问题是:关键字对这种情况有用吗?

  • 如果我没有错的话,Thread-1和thread-3正在进入synchronized方法,因为它有两个不同的目标对象。但是为什么线程2进入同步块呢? 请帮助我理解这一点。提前谢了。

  • 面试问题 比如说,我们有一个在Employee表中有200万条记录的表,我们需要削减每个员工10%的工资(需要做一些处理),然后将其保存回collection。你怎样才能有效地做到这一点。 我问他,我们可以使用executor框架来创建多个线程,这些线程可以从表中获取值,然后我们可以处理并将其保存到列表中。 然后他问我,你将如何检查一个记录是否已经被处理,我不知道(如何做)。 甚至我也不确定我是否

  • 我有以下情况: 之后,我启动三个线程中的每一个线程,它们迭代本地产品列表,并对其进行修改。 我在迭代本地产品ArrayList时获得一个ConcurrentModificationException。 为什么会出现这种情况?我假设,如果我在每个线程中创建一个完整的新列表,我可以在本地任意修改它,而不关心其他线程--我说的对吗?还是从本地列表中删除某个对象会影响pbjects,从而导致其他线程抛出并

  • 在学习基本的线程管理时,我发现很难理解书中的这些行(粗体)。 一旦您启动了线程,您需要明确地决定是等待它完成(通过与它连接--参见第2.1.2)还是让它自己运行(通过分离它--参见第2.1.3)。如果在std::Thread对象被销毁之前没有做出决定,那么程序将被终止(std::Thread析构函数调用std::Terminate())。因此,即使存在异常,也必须确保线程正确连接或分离。有关处理此

  • 我正在设计一个模块,可以支持不同的数据源。我的模块获取用户的公司id作为输入,并且我必须根据公司id调用适当的类。我正在尝试合并一些好的设计,尽可能避免条件语句。 我有一个使用此方法的FetchDataSource单例类。 “communicator”是一个接口,而communicator映射将返回适当的实例。这是同一个单例类中的populateCommunicatorMap()方法。