>  기사  >  Java  >  자바 대기와 수면의 차이점은 무엇입니까

자바 대기와 수면의 차이점은 무엇입니까

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼원래의
2019-12-27 15:15:303510검색

자바 대기와 수면의 차이점은 무엇입니까

자바 대기와 수면의 차이점은 무엇입니까

sleep()과 wait() 메서드의 가장 큰 차이점은 다음과 같습니다.

#🎜🎜 #

·sleep() 잠자는 동안 개체 잠금을 유지하고 여전히 잠금을 점유합니다. 🎜🎜#wait()가 잠자면 개체가 잠깁니다. 출시됩니다.

  · 그러나 wait() 및 sleep() 모두 Interrupt() 메서드를 통해 스레드의 일시 중지 상태를 중단할 수 있습니다. 이로 인해 스레드가 즉시 InterruptedException을 발생시킵니다(그러나 이 방법은 권장되지 않습니다).

/**
 * Created by jiankunking on 2018/4/5.
 */
public class ThreadTest implements Runnable {
    int number = 10;
    public void addHundred() throws Exception {
        System.out.println("addHundred  begin");
        synchronized (this) {
            number += 100;
            System.out.println("addHundred:" + number);
        }
        System.out.println("addHundred  end");
    }
    public void wait2Seconds() throws Exception {
        System.out.println("wait2Seconds begin ");
        synchronized (this) {
            /**
             * (休息2S,阻塞线程)
             * 以验证当前线程对象的机锁被占用时,
             * 是否被可以访问其他同步代码块
             */
            System.out.println(".............wait begin..................");
            this.wait(2000);
            number *= 200;
            System.out.println(".............wait end..................");
        }
        System.out.println("wait2Seconds end ");
    }
    public void sleep2Seconds() throws Exception {
        System.out.println("sleep2Seconds begin ");
        synchronized (this) {
            /**
             * (休息2S,阻塞线程)
             * 以验证当前线程对象的机锁被占用时,
             * 是否被可以访问其他同步代码块
             */
            System.out.println("............sleep begin...................");
            Thread.sleep(2000);
            number *= 200;
            System.out.println(".............sleep end..................");
        }
        System.out.println("sleep2Seconds end ");
    }
    @Override
    public void run() {
        try {
            addHundred();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) throws Exception {
        ThreadTest threadTest = new ThreadTest();
        Thread thread = new Thread(threadTest);
        thread.start();
        //threadTest.sleep2Seconds();
        //threadTest.wait2Seconds();
    }
}

threadTest.sleep2Seconds() 시 출력 결과는 다음과 같습니다.

threadTest.wait2Seconds() 시, 출력 결과는 다음과 같습니다:

자바 대기와 수면의 차이점은 무엇입니까

sleep2Seconds()/wait2Seconds()는 secondMethod()로 표시됩니다.

이를 간단히 분석해 보면 코드 부분에서는 ThreadTest가 main() 메서드에서 인스턴스화되어 스레드가 시작된 후 스레드의 메서드(secondMethod())가 호출되기 때문에 메인 스레드에서 메서드가 호출됩니다. secondMethod()라는 일반 메소드가 먼저 실행됩니다. (그러나 일반 메소드가 실행될 때까지 객체의 스레드 메소드는 실행되지 않습니다. 일반 메소드가 실행되는 동안 스레드의 메소드도 실행됩니다. 교대로 실행되지만 메인 스레드의 일반 메소드가 먼저 실행되므로 프로그램이 실행되면 secondMethod()가 먼저 실행되고 secondMethod() 메소드 코드 조각에 동기화된 블록이 있습니다. secondMethod 메소드가 실행되면 해당 메소드는 객체의 기계 잠금을 점유하여 객체의 스레드 메소드가 차단된 상태로 유지됩니다.

자바 대기와 수면의 차이점은 무엇입니까Thread.sleep을 사용할 때(2000; ) 메서드는 sleep이 스레드를 차단하고 개체 잠금을 유지하기 때문에 동기화된 블록이 실행될 때까지(sleep이 완료될 때까지) 개체의 다른 동기화 스레드(secondMethod())를 실행할 수 없으므로 secondMethod() 메서드를 실행할 수 있으므로 출력 결과는 다음과 같습니다.

number*200+100;

this.wait(2000) 메서드를 사용하는 경우 secondMethod () 메서드가 실행된 후 this.wait(2000)을 사용하면 개체의 기계 잠금도 잠깁니다. 이 때 메소드는 2S 동안 Sleep 상태가 되고 현재 보유하고 있는 잠금을 해제합니다. 이때 스레드의 동기화 메소드가 실행됩니다(secondMethod가 보유하고 있는 잠금이 wait()에 의해 해제되었기 때문입니다). 따라서 출력 결과는 다음과 같습니다. :

number+100;

Java의 sleep 메소드에 대한 몇 가지 참고 사항:

#🎜 🎜#

1 Thread.sleep() 메소드는 일시 중지하는 데 사용됩니다. 스레드를 실행하고 스레드 스케줄러에 CPU를 제공합니다.

2. Thread.sleep() 메서드는 현재 실행 중인 스레드를 일시 중지하는 정적 메서드입니다.

3. Java에는 두 가지 절전 방법이 있는데, 하나에는 밀리초 매개변수가 하나만 있고 다른 하나에는 밀리초와 나노초라는 두 개의 매개변수가 있습니다.

4. wait 방식과 달리 sleep 방식은 잠금을 해제하지 않습니다.

5. 다른 스레드가 절전 모드 스레드를 중단하면 절전 메서드에서 중단된 예외가 발생합니다.

6. 휴면 스레드는 깨어난 후 CPU를 확보한다는 보장이 없습니다. 먼저 준비 상태로 들어가 CPU를 두고 다른 스레드와 경쟁합니다.

7. 오류가 발생하기 쉬운 곳이 있습니다. t.sleep()이 호출되면 스레드 t가 일시 중지됩니다. Thread.sleep은 스레드 t 대신 현재 스레드를 절전 모드로 전환하는 정적 메서드이기 때문에 이는 잘못된 것입니다.

8. wait 메소드는 동기화된 메소드나 동기화된 코드 블록과 같은 동기화된 환경에서 사용해야 합니다. 동기화된 조건에서 사용하지 않으면 IllegalMonitorStateException이 발생합니다. 또한 동기 조건에서는 sleep 메서드를 호출할 필요가 없으므로 정상적으로 사용할 수 있습니다.

9. wait 메소드는 Object 클래스에서 사용되고 정의되며, sleep 메소드는 현재 스레드에서 작동하며 java.lang.Thread 클래스에서 정의됩니다.

PHP 중국어 웹사이트에는 무료

JAVA 입문 튜토리얼

이 많이 있습니다. 누구나 배울 수 있습니다!

위 내용은 자바 대기와 수면의 차이점은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.