У меня есть два потока, и в настоящее время я выполняю блокировку с помощью методов Object notify() и wait() внутри синхронизированных блоков. Я хотел убедиться, что основной поток никогда не блокируется, поэтому я использовал булево таким образом (только соответствующий код при условии.)Синхронизированные блоки и блокировки
//Just to explain an example queue
private Queue<CustomClass> queue = new Queue();
//this is the BOOLEAN
private boolean isRunning = false;
private Object lock;
public void doTask(){
ExecutorService service = Executors.newCachedThreadPool();
//the invocation of the second thread!!
service.execute(new Runnable() {
@Override
public void run() {
while(true){
if (queue.isEmpty()){
synchronized (lock){
isRunning = false; //usage of boolean
lock.wait();
}
}
else{
process(queue.remove());
}
}
});
}
//will be called from a single thread but multiple times.
public void addToQueue(CustomClass custObj){
queue.add(custObj);
//I don't want blocking here!!
if (!isRunning){
isRunning = true; //usage of BOOLEAN!
synchronized(lock){
lock.notify();
}
}
}
ли что-то, кажется, здесь не так? Благодарю. Редактировать: Назначение: Таким образом, когда add() будет вызываться во второй раз и более, он не будет заблокирован при уведомлении(). Есть ли лучший способ добиться этого неблокирующего поведения основного потока?
Хм, почему бы вам не использовать 'BlockingQueue '? – fge
Пометка' isRunning' как 'volatile'. Доступ разрешен из двух потоков. –
В чем проблема? –