Потоки Java - Разница между спящим режимом, ожиданием и уведомлением
Оба метода sleep() и wait() приостановить текущий поток и возобновить его выполнение после уведомления, которое запускается через определенное время или другим процессом.wait может быть пробужден другим потоком, который вызывает notify. Важно, чтобы wait et notify вызываться в блоке синхронизированный который используется для взаимного исключения. Метод notify пробуждает первый процесс, вызвавший wait.
Пример wait() и notify()
В этой программе процесс B запускается внутри процесса A и создает взаимную зону исключения для блокировки и предотвращения выполнения оператора процессом A после блока public class Thread_A {public static void main(String[] args) {
Thread Thread_B = new Thread(new Runnable() {
@Override
public void run() {
synchronized (this) {
int i=0;
while(i< 100)
i++;
//свободный поток A
notify();
}
}
});
Thread_B.start();
synchronized(Thread_B) {
try {
System.out.println("Поток A заблокирован - Ожидание потока B"+
"завершения");
//поставить поток A
Thread_B.wait() на удержание;
} catch (InterruptedException e) {
// TODO Автоматически сгенерированный catch block
e.printStackTrace();
}
System.out.println("Поток B завершен - поток A освобожден");
}
}
}
Output
Поток A застрял Ожидание завершения потока B
Поток B завершен. Поток A отпущен
Пример sleep()
Метод sleep() блокирует процесс и выполняет его в течение заданного времени. Этот метод используется для синхронизации со временем (например, пробуждение через 4 секунды) или для того, чтобы сказать sleep и позволить другим потокам запуститься.
public class Sleep {Output
public static void main(String[] args) {
ThreadA a = new ThreadA();
a.start();
ThreadB b = new ThreadB();
b.start();
}
статический класс ThreadA extends Thread{
@Override
public void run() {
try {
System.out.println("Поток A");
sleep(4000);
System.out.println("Поток A: Я проспал 4 секунды");
} catch (InterruptedException e) {
// TODO Автоматически сгенерированный catch block
e.printStackTrace();
}
}
}
статический класс ThreadB extends Thread{
@Override
public void run() {
System.out.println("Поток B");
int sum = 0;
for(int i = 0 ; i < 50; i++)
sum +=i;
System.out.println("Поток B: Я закончил");
}
}
}
Поток AПроцесс A начался раньше процесса B, но B выполнил обработку, в то время как процесс A спал и закончил первый
Поток B
Поток B: Я закончил
Поток A: Я проспал 4 секунды