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);
            }
        }
    }
}

좋은 웹페이지 즐겨찾기