Методы wait, notify и notifyAll являются последними собственными методами класса Object. Следовательно, эти методы не могут быть переопределены подклассами. Класс Object является суперклассом всех классов, поэтому в программе существуют следующие три формы вызова wait и других методов.
Скопируйте код кода следующим образом:
ожидание();//Метод 1:
this.wait();//Метод 2:
super.wait();//Метод 3
недействительный уведомитьВсе()
Разблокирует все потоки, вызывающие метод ожидания для этого объекта. Этот метод можно вызвать только внутри синхронизированного метода или синхронизированного блока. Если текущий поток не является держателем блокировки, этот метод создает исключение IllegalMonitorStateException.
недействительное уведомление()
Случайным образом выберите поток, который вызывает метод ожидания объекта, чтобы разблокировать его. Этот метод можно вызвать только внутри синхронизированного метода или синхронизированного блока. Если текущий поток не является держателем блокировки, этот метод создает исключение IllegalMonitorStateException.
недействительное ожидание()
Заставляет поток войти в состояние ожидания до тех пор, пока он не будет разбужен другими потоками с помощью notify() или notifyAll. Этот метод можно вызвать только внутри синхронизированного метода. Если текущий поток не является держателем блокировки, этот метод создает исключение IllegalMonitorStateException.
void wait(long millis) и void wait(long millis,int nanos)
Заставляет поток перейти в состояние ожидания до тех пор, пока он не будет уведомлен или не истечет указанное время. Эти методы можно вызывать только внутри синхронизированных методов. Если текущий поток не является держателем блокировки, этот метод создает исключение IllegalMonitorStateException.
Object.wait(), Object.notify() и Object.notifyall() должны быть написаны внутри синхронизированного метода или внутри синхронизированного блока. Это связано с тем, что эти методы требуют, чтобы поток, в данный момент выполняющий метод object.wait(), владел объектом. объект. Блокировка объекта. Даже если вы точно знаете, что текущий контекстный поток владеет блокировкой объекта, вы не можете писать операторы типа object.wait() в текущем контексте. нравиться:
Скопируйте код кода следующим образом:
пакет edu.sjtu.erplab.ObjectTest;
класс А
{
общедоступная синхронизированная пустота printThreadInfo() выдает InterruptedException
{
Поток t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
}
}
общественный класс ObjectWaitTest {
public static void main(String args[])
{
А = новый А();
//Поскольку метод printThreadInfo() выдает InterruptedException, здесь необходимо использовать блок try-catch.
пытаться {
а.printThreadInfo();
а.ожидание();
} catch (InterruptedException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
}
}
При запуске программы будет сообщено об ошибке, и результаты будут следующими:
Идентификатор потока: 1, Имя потока: основной
Исключение в потоке «основной» java.lang.IllegalMonitorStateException
в java.lang.Object.wait (собственный метод)
в java.lang.Object.wait(Object.java:485)
в edu.sjtu.erplab.ObjectTest.ObjectWaitTest.main(ObjectWaitTest.java:24)
Правильный способ написания должен быть
Скопируйте код кода следующим образом:
пакет edu.sjtu.erplab.ObjectTest;
класс А
{
общедоступная синхронизированная пустота printThreadInfo() выдает InterruptedException
{
Поток t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
// this.wait(); // Продолжаем ждать
this.wait(1000);//Подождите 1000 мс
// супер.wait(1000);
}
}
общественный класс ObjectWaitTest {
public static void main(String args[])
{
А = новый А();
//Поскольку метод printThreadInfo() выдает InterruptedException, здесь необходимо использовать блок try-catch.
пытаться {
а.printThreadInfo();
//а.ожидание();
} catch (InterruptedException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
Поток t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
}
}