Вы не полный пример, который делает его трудно сказать, что вы делаете неправильно; я предполагаю, что ваш флаг состояния не установлен соответствующим образом. Вот полный пример, который работает, он гарантирует, что только один поток имеет доступ к ресурсу за раз.
public class StuffExample {
public static void main(String[] args) throws Exception {
Worker worker = new Worker(new StuffHolder());
Thread t1 = new Thread(worker);
Thread t2 = new Thread(worker);
t1.start();
t2.start();
Thread.sleep(10000L);
t1.interrupt();
t2.interrupt();
}
}
class Worker implements Runnable {
private StuffHolder holder;
public Worker(StuffHolder holder) {
this.holder = holder;
}
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
holder.useStuff();
Thread.sleep(1000L);
}
}
catch (InterruptedException e) {
}
}
}
class StuffHolder {
private boolean inUse = false;
private int count = 0;
public synchronized void useStuff() throws InterruptedException {
while (inUse) {
wait();
}
inUse = true;
System.out.println("doing whatever with stuff now, count="
+ count + ", thread=" + Thread.currentThread().getName());
count += 1;
inUse = false;
notifyAll();
}
}
Выход:
doing whatever with stuff now, count=0, threadid=Thread-0
doing whatever with stuff now, count=1, threadid=Thread-1
doing whatever with stuff now, count=2, threadid=Thread-0
doing whatever with stuff now, count=3, threadid=Thread-1
doing whatever with stuff now, count=4, threadid=Thread-0
doing whatever with stuff now, count=5, threadid=Thread-1
doing whatever with stuff now, count=6, threadid=Thread-0
doing whatever with stuff now, count=7, threadid=Thread-1
doing whatever with stuff now, count=8, threadid=Thread-0
doing whatever with stuff now, count=9, threadid=Thread-1
doing whatever with stuff now, count=10, threadid=Thread-0
doing whatever with stuff now, count=11, threadid=Thread-1
doing whatever with stuff now, count=12, threadid=Thread-0
doing whatever with stuff now, count=13, threadid=Thread-1
doing whatever with stuff now, count=14, threadid=Thread-0
doing whatever with stuff now, count=15, threadid=Thread-1
doing whatever with stuff now, count=16, threadid=Thread-1
doing whatever with stuff now, count=17, threadid=Thread-0
doing whatever with stuff now, count=18, threadid=Thread-1
doing whatever with stuff now, count=19, threadid=Thread-0
См Oracle's tutorial on guarded blocks.
это трудно сказать, не будучи в состоянии см. окружающий код, но похоже, что значение 'myCondition' должно быть' false', что мешает войти в ваш цикл while; в противном случае 'System.out.println' должно быть выполнено. Еще одна вещь, которую я вижу: ваш код отформатирован так, как будто вы включаете полную структуру 'while'; однако скобки не совпадают по всему образцу кода, поэтому закрывающая скобка ('}'), которая следует за вашей первой 'try'-'catch', фактически закрывает цикл while. Правильно ли ваша структура кода? –
Просто, чтобы быть ясным, это все действительно только один блок кода? Или это два блока кода, каждый из которых работает в одном потоке? Как и сейчас, если предположить, что все это окружено блоком «synchronized» (который вы не включили в вопрос), метод 'wait()' будет ждать бесконечно для 'notify()' _ из другого потока_, который будет никогда не приходите. Уведомление не может исходить из этого потока, потому что поток никогда не дойдет до него, потому что он все еще ждет уведомления. Вы, по сути, зашли в тупик. – yshavit
Отредактировано мое сообщение, чтобы его было легче читать и понимать. Это 1 блок кода - синхронизированный метод, который Threads вызывает, когда им приходится использовать «общий» объект. – LFCLPFC