У меня проблема с отладкой моего SynchronousQueue. его в студии Android, но не имеет значения для его кода Java. Я передаю истину конструктору SynchronousQueue, поэтому его «справедливое» означает его очередь fifo. Но он не подчиняется правилам, его все еще разрешает потребителю печатать сначала и продюсеру после. Вторая проблема, которую я имею, - это то, что я хочу, чтобы эти потоки никогда не умирали, думаете ли вы, что я должен использовать цикл while для производителя и потребительского потока и позволить им «производить и потреблять» друг друга?Решение проблемы параллелизма между производителями и поставщиками SynchronousQueue. Свойство Fairness не работает
вот мой простой код:
package com.example.android.floatingactionbuttonbasic;
import java.util.concurrent.SynchronousQueue;
import trikita.log.Log;
public class SynchronousQueueDemo {
public SynchronousQueueDemo() {
}
public void startDemo() {
final SynchronousQueue<String> queue = new SynchronousQueue<String>(true);
Thread producer = new Thread("PRODUCER") {
public void run() {
String event = "FOUR";
try {
queue.put(event); // thread will block here
Log.v("myapp","published event:", Thread
.currentThread().getName(), event);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
producer.start(); // starting publisher thread
Thread consumer = new Thread("CONSUMER") {
public void run() {
try {
String event = queue.take(); // thread will block here
Log.v("myapp","consumed event:", Thread
.currentThread().getName(), event);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
consumer.start(); // starting consumer thread
}
}
чтобы начать темы я простой вызов new SynchronousQueueDemo().startDemo();
Журналы всегда выглядят так, независимо от того, что я прохожу в SynchronousQueue конструктору быть «справедливым»:
/SynchronousQueueDemo$2$override(26747): myapp consumed event: CONSUMER FOUR
V/SynchronousQueueDemo$1$override(26747): myapp published event:PRODUCER FOUR
Проверка docs here, он говорит следующее:
public SynchronousQueue (boolean fair) Создает синхронный вызов с указанной политикой справедливости. Параметры: fair - если true, ожидающие потоки утверждают в заказе FIFO для доступа; иначе порядок не указан.
прерван всегда будет ложными в этом случае – thedarkpassenger
Что ты имеешь в виду? Политика остановки потока - прерывать(); который затем установит прерванный = истинный. Пожалуйста, объясните, и я исправлю. Спасибо. –
Да, простите, я плохой плохой разговор. – thedarkpassenger