Основная проблема, с которой вы столкнулись, состоит в том, что вы освобождаете синхронизированный блок, позволяя обоим потокам проходить цикл одновременно.Это означает, что любой поток может получить блокировку в любом порядке.
AFAIK, самое простое решение - использовать флаг.
final int length = 10;
final AtomicBoolean flag = new AtomicBoolean();
new Thread(new Runnable() {
public void run() {
for (int i=1;i<=length;i++) {
while(flag.get());
System.out.print(i+" ");
flag.set(true);
}
}
}).start();
new Thread(new Runnable() {
public void run() {
for (char c='a';c<'a'+length;c++) {
while(!flag.get());
System.out.print(c+" ");
flag.set(false);
}
System.out.println();
}
}).start();
Самый элегантный способ выполнить эту задачу синхронно:иметь одну нить.Потоки специально предназначены для выполнения двух задач с как можно меньшей зависимостью между ними.
BTW
Если notifyAll () вызывается до вызова wait (), уведомление будет потеряно.wait () будет ждать вечно.
Вы создаете объект Тестирования, который вы отбрасываете (удаляете).
Вы перехватываете InterruptedException, которое вы печатаете, и продолжаете, как будто ничего не произошло (т.е. удаляете вложенный улов)