java 다중 루틴 대기/알림 메커니즘
4106 단어 기술 공학
구체적인 실현 방식은 스레드 A가 대상 O의wait() 방법을 호출해 대기 상태에 들어가고, 또 다른 스레드 B는 대상 B의notify() or notifyAll() 방법을 호출해 스레드 A가 알림을 받은 후 대상 O의wait() 방법으로 되돌아와 후속 작업을 수행하는 것이다.논리적 프로세스는 다음과 같습니다.
thread1 object1 monitor, object1.wait()
- object1 monitor, thread1 wait;
thread2 object1 monitor, object1.notify()
- thread1, object1 monitor;
thread1 object1 monitor, object1.wait() , thread1 .
데모 데모는 다음과 같습니다.
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class WaitNotify {
static boolean flag = true;
static Object lock = new Object();
public static void main(String[] args) throws Exception {
Thread waitThread = new Thread(new Wait(), "WaitThread");
waitThread.start();
TimeUnit.SECONDS.sleep(1);
Thread notifyThread = new Thread(new Notify(), "NotifyThread");
notifyThread.start();
}
static class Wait implements Runnable {
@Override
public void run() {
synchronized (lock) {
while (flag) {
try {
System.out.println(Thread.currentThread() + " flag is true. wait @ "
+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
lock.wait();
} catch (InterruptedException e) {
}
}
System.out.println(Thread.currentThread() + " flag is false. running @ "
+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
}
}
}
static class Notify implements Runnable {
@Override
public void run() {
synchronized (lock) {
System.out.println(Thread.currentThread() + " hold lock. notify @ "
+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
lock.notifyAll();
flag = false;
SleepUtils.second(5);
}
synchronized (lock) {
System.out.println(Thread.currentThread() + " hold lock again. sleep @ "
+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
SleepUtils.second(5);
}
}
}
}