у меня есть такой сценарий:Поделитесь одной переменной между потоками?
class MyClass {
Producer p;
Consumer c;
public static void main(String[] args){
BlockingQueue q = new LinkedBlockingQueue();
p = new Producer(q);
c = new Consumer(q);
Thread t = new Thread(p);
t.start();
new Thread(c).start();
while (true) {
if (!p.getContinuer()) {
c.setContinuer(false);
System.out.println("here:"+p.getContinuer().toString());
break;
}
}
System.out.println("finish all");
}
}
class Producer implements Runnable {
private final BlockingQueue queue;
private AtomicBoolean continuer = new AtomicBoolean(true);
public Boolean getContinuer() {
return continuer.get();
}
@Override
public void run() {
while(true){
//open socket
//read data from socket
queue.put(data);
if(end){
System.out.println("Shutting down Producer");
continuer.getAndSet(false);
}
}
}
}
class Consumer implements Runnable {
private final BlockingQueue queue;
private static AtomicBoolean continuer = new AtomicBoolean(true);
public void setContinuer(Boolean continuerr) {
continuer = new AtomicBoolean(continuerr);
}
public Boolean getContinuer() {
return continuer.get();
}
@Override
public void run() {
while (getContinuer()) {
//Do some work
consume(queue.take());
}
System.out.println("shut down Consumer");
}
}
это то, что я получаю:
Выключение Производитель
здесь: ложные
закончить все
, что означает, что потребитель все еще работает, а переменная «продолжатель» не обновляется.
Я видел также this и this сообщений, я попробовал, но ничего не изменилось.
В чем моя проблема?
EDIT: я изменил код, и, видимо, потребитель заблокирован (waiting if no elements are present on this queue.) при попытке чтения данных из BlockingQueue (см потреблять (queue.take()); в классе потребителей).
Этот код не компилируется. – aioobe
@aioobe - это было бы проблемой :) – willcodejavaforfood
нет, мой код компилируется (это всего лишь образец моего кода, поэтому, возможно, есть некоторая ошибка). – mohamida