자바 스 레 드 학습 기록(6)--sleep

23116 단어 자바
Sleep 방법
역할:스 레 드 를 예상 한 시간 에 실행 시 키 고 싶 습 니 다.다른 때 는 CPU 자원 을 사용 하지 마 십시오.다음 에 호출 될 때 까지 CPU 자원 을 사용 합 니 다.특징:
sleep 방법 은 자 물 쇠 를 풀 지 않 습 니 다
  • wait 와 달리 wait 는 자 물 쇠 를 잠 글 수 있 지만 sleep 는 할 수 없습니다.sleep 기간 에는 아무 도 자 물 쇠 를 가 져 갈 수 없습니다
  • 스 레 드 sleep 때 synchronized monitor 를 사용 하지 않 습 니 다.
    public class SleepDontReleaseMonitor implements Runnable {
        public static void main(String[] args) {
            SleepDontReleaseMonitor sleepDontReleaseMonitor = new SleepDontReleaseMonitor();
            new Thread(sleepDontReleaseMonitor).start();
            new Thread(sleepDontReleaseMonitor).start();
        }
    
        @Override
        public void run() {
            syn();
        }
    
        private synchronized void syn() {
            System.out.println(Thread.currentThread().getName() + "    monitor");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "        ");
        }
    }
    

    출력 에서 볼 수 있 듯 이 sleep 이 끝 난 후에 야 두 번 째 스 레 드 를 계속 실행 할 수 있 습 니 다.
    Thread-0    monitor
    Thread-0        
    Thread-1    monitor
    Thread-1        
    

    sleep 에서 lock 을 풀 지 않 습 니 다(lock 은 수 동 으로 풀 어야 합 니 다)
    public class SleepDontReleaseLock implements Runnable {
    
        //    
        private static final Lock lock = new ReentrantLock();
    
        @Override
        public void run() {
            lock.lock();
            System.out.println(Thread.currentThread().getName() + "    ");
            try {
                Thread.sleep(5000);
                System.out.println(Thread.currentThread().getName() + "       ");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    
        public static void main(String[] args) {
            SleepDontReleaseLock sleepDontReleaseLock = new SleepDontReleaseLock();
            new Thread(sleepDontReleaseLock).start();
            new Thread(sleepDontReleaseLock).start();
    
        }
    }
    

    출력 에서 볼 때 스 레 드 도 sleep 가 끝 날 때 까지 기 다 려 야 자 물 쇠 를 풀 수 있 고 다른 스 레 드 는 자 물 쇠 를 얻 을 수 있 습 니 다.
    Thread-0    
    Thread-0      
    Thread-1    
    Thread-1      
    

    sleep 응답 중단
    현재 시간 을 1 초 간격 으로 출력,중단,관찰
    public class SleepInterrupted implements Runnable {
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println(new Date());
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    System.out.println("     !");
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            Thread thread = new Thread(new SleepInterrupted());
            thread.start();
            Thread.sleep(6500);
            thread.interrupt();
        }
    }
    

    출력
    Thu May 21 21:19:12 CST 2020
    Thu May 21 21:19:13 CST 2020
    Thu May 21 21:19:14 CST 2020
    Thu May 21 21:19:15 CST 2020
    Thu May 21 21:19:16 CST 2020
    Thu May 21 21:19:17 CST 2020
    Thu May 21 21:19:18 CST 2020
         !
    java.lang.InterruptedException: sleep interrupted
    	at java.lang.Thread.sleep(Native Method)
    	at java.lang.Thread.sleep(Thread.java:340)
    	at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
    	at threadcoreknowledge.threadobjectclasscommonmethods.SleepInterrupted.run(SleepInterrupted.java:19)
    	at java.lang.Thread.run(Thread.java:748)
    Thu May 21 21:19:18 CST 2020
    Thu May 21 21:19:19 CST 2020
    Thu May 21 21:19:20 CST 2020
    

    출력 에서 중단 되 었 을 때 던 진 이상 을 뚜렷하게 볼 수 있 습 니 다.여 기 는**TimeUnit.SECONDS.sleep(1)을 추천 합 니 다.**방식 은 생산 환경 에서 3 시간 24 분 50 초 와 같은 상황 이 발생 할 수 있 기 때문에 Thead.sleep()을 사용 하면 밀리초 가 필요 합 니 다.우 리 는 시간 을 전환 해 야 합 니 다.추천 하 는 방식 을 사용 하면 소 개 를 하 겠 습 니 다.또한 Thread.sleep()방법 에 서 는 인자 가 0 보다 적 으 면 이상 을 던 지고 첫 번 째 방법 은 무시 합 니 다.
    TimeUnit.HOURS.sleep(3);
    TimeUnit.MINUTES.sleep(24);
    TimeUnit.SECONDS.sleep(1);
    

    총결산
    sleep 방법 은 스 레 드 를 Waiting 상태 로 들 어가 게 하고 CPU 자원 을 차지 하지 않 지만 자 물 쇠 를 풀 지 않 습 니 다.정 해진 시간 후에 실 행 될 때 까지 휴면 기간 이 중단 되면 이상 을 던 지고 중단 상 태 를 제거 합 니 다.
    wait/notify,sleep 공통점
    같다
  • 차단(대상 상 태 는 Waiting,TimeWaiting);
  • 응답 중단(휴면 기간 에 모두 응답 중단)

  • 차이 점
    4.567917.wait/notify 는 동기 코드 블록 에 넣 어야 합 니 다.sleep 는 필요 없습니다.wait/notify 는 서로 협조 해 야 합 니 다.스 레 드 가 더욱 안전 하고 잠 금 해제 와 영구적 인 기다 림 을 방지 합 니 다
    wait/notify 는 자 물 쇠 를 풀 고 sleep 는 풀 지 않 습 니 다
  • 지 정 된 시간(매개 변수 가 다 름),wait 는 깨 어 날 때 까지 시간 을 지정 하지 않 을 수 있 습 니 다.sleep 는 직접;을 지정 해 야 합 니 다
  • 소속 클래스 가 다 르 고 wait/notify 는 Object 에 속 합 니 다.자바 의 디자인 에서 모든 대상 은 하나의 자물쇠 이 고 sleep 는 Thread 에 속 하기 때 문 입 니 다
  • 좋은 웹페이지 즐겨찾기