java 다 중 루틴 wait,notify

  • 대상 자물쇠 와 관련 되 기 때문에 Wait,Notify 는 반드시 synchronized 에서 사용 해 야 합 니 다

  • Wait 는 현재 실행 중인 스 레 드 를 잠 정적 으로 정 하고 자원 자 물 쇠 를 풀 어 다른 스 레 드 가 실 행 될 수 있 도록 해 야 합 니 다notify/notifyall:깨 우기 루틴공유 변수
    public class ShareEntity {
        private String name;
        //       
        private Boolean flag = false;
    
        public ShareEntity() {
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Boolean getFlag() {
            return flag;
        }
    
        public void setFlag(Boolean flag) {
            this.flag = flag;
        }
    }

    스 레 드 1(생산자)
    public class CommunicationThread1 extends Thread{
    
        private ShareEntity shareEntity;
        public CommunicationThread1(ShareEntity shareEntity) {
            this.shareEntity = shareEntity;
        }
    
        @Override
        public void run() {
            int num = 0;
            while (true) {
                synchronized (shareEntity) {
                    if (shareEntity.getFlag()) {
                        try {
                            shareEntity.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
    
                    if (num % 2 == 0)
                        shareEntity.setName("thread1-set-name-0");
                    else
                        shareEntity.setName("thread1-set-name-1");
                    num++;
                    shareEntity.setFlag(true);
                    shareEntity.notify();
                }
            }
        }
    }
    

    스 레 드 2(소비자)
    public class CommunicationThread2 extends Thread{
        private ShareEntity shareEntity;
        public CommunicationThread2(ShareEntity shareEntity) {
            this.shareEntity = shareEntity;
        }
    
        @Override
        public void run() {
            while (true) {
                synchronized (shareEntity) {
                    if (!shareEntity.getFlag()) {
                        try {
                            shareEntity.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(shareEntity.getName());
                    shareEntity.setFlag(false);
                    shareEntity.notify();
                }
            }
        }
    }
    

    요청
    @RequestMapping("test-communication")
        public void testCommunication() {
            ShareEntity shareEntity = new ShareEntity();
            CommunicationThread1 thread1 = new CommunicationThread1(shareEntity);
            CommunicationThread2 thread2 = new CommunicationThread2(shareEntity);
            thread1.start();
            thread2.start();
        }

    결과
    thread1-set-name-0thread1-set-name-1thread1-set-name-0thread1-set-name-1thread1-set-name-0thread1-set-name-1thread1-set-name-0

    좋은 웹페이지 즐겨찾기