我已经面临这个问题很多天了,请帮我解决。我正在使用线程同步实现生产者-消费者示例。我在这个传统节目中做了一些调整。我没有只使用一个队列对象,而是使用了两个队列对象。但程序不起作用。。(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);
}
}
我得到了答案。我的误解是等待、通知和通知所有方法都是线程类的。所以我在线程对象上调用它们。
解决方案是只调用线程以外的共享静态对象上的等待和通知方法。
答复:-
类队列{
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()方法。