> Java > java지도 시간 > 본문

Java의 스레드 Yield() 및 스레드 Sleep sleep() 메소드에 대한 자세한 설명

高洛峰
풀어 주다: 2017-01-05 15:42:58
원래의
1962명이 탐색했습니다.

스레드 수율: Yield()
yield()는 수율을 나타냅니다. 이는 현재 스레드가 "실행 상태"에서 "준비 상태"로 들어갈 수 있도록 허용하여 동일한 우선순위를 가진 다른 대기 스레드가 실행 권한을 얻을 수 있도록 허용합니다. 그러나 현재 스레드가 Yield()를 호출한 후에 다른 스레드가 실행된다는 보장은 없습니다. 대기 중인 스레드는 동일한 우선순위를 갖게 됩니다. 스레드는 확실히 실행 권한을 얻을 수 있으며 현재 스레드가 "실행 중 상태"에 진입하여 계속 실행될 수도 있습니다.
예:

class ThreadA extends Thread{
  public ThreadA(String name){ 
    super(name); 
  } 
  public synchronized void run(){ 
    for(int i=0; i <10; i++){ 
      System.out.printf("%s [%d]:%d\n", this.getName(), this.getPriority(), i); 
      // i整除4时,调用yield
      if (i%4 == 0)
        Thread.yield();
    } 
  } 
} 
 
public class YieldTest{ 
  public static void main(String[] args){ 
    ThreadA t1 = new ThreadA("t1"); 
    ThreadA t2 = new ThreadA("t2"); 
    t1.start(); 
    t2.start();
  } 
}
로그인 후 복사

(특정 시간) 실행 결과:

t1 [5]:0
t2 [5]:0
t1 [5]:1
t1 [5]:2
t1 [5]:3
t1 [5]:4
t1 [5]:5
t1 [5]:6
t1 [5]:7
t1 [5]:8
t1 [5]:9
t2 [5]:1
t2 [5]:2
t2 [5]:3
t2 [5]:4
t2 [5]:5
t2 [5]:6
t2 [5]:7
t2 [5]:8
t2 [5]:9
로그인 후 복사

결과 설명:
"스레드 t1"이 4의 정수일 수 있는 경우 , "스레드 t2"에 대한 스위치가 없습니다. 이는 Yield()가 스레드가 "실행 중 상태"에서 "준비 상태"로 들어가도록 허용할 수 있지만 반드시 다른 스레드가 CPU 실행 권한을 얻는 것을 허용하지는 않는다는 것을 보여줍니다(즉, 다른 스레드가 "실행 중 상태"로 들어가게 함). "), 이 "다른 스레드"가 현재 Yield()를 호출하는 스레드와 동일한 우선순위를 갖는 경우에도 마찬가지입니다.

yield()와 wait()의 비교:
wait()의 기능은 현재 스레드를 "실행 상태"에서 "대기(차단) 상태"로 진입시키고 또한 동기화 잠금을 해제합니다. Yield()의 기능은 포기하는 것이며 현재 스레드를 "실행 상태"에서 벗어나게 합니다. 둘 사이의 차이점은 다음과 같습니다.
(1) wait()는 스레드가 "실행 상태"에서 "대기(차단) 상태"로 들어가도록 허용하는 반면, Yield()는 스레드가 "실행 상태"에서 "준비 상태"로 들어가도록 허용합니다. "실행 상태" ".
(2) wait()는 스레드가 보유하고 있는 객체의 동기화 잠금을 해제하도록 하지만, Yield() 메서드는 잠금을 해제하지 않습니다.
다음 예에서는 Yield()가 잠금을 해제하지 않음을 보여줍니다.

public class YieldLockTest{ 
 
  private static Object obj = new Object();
 
  public static void main(String[] args){ 
    ThreadA t1 = new ThreadA("t1"); 
    ThreadA t2 = new ThreadA("t2"); 
    t1.start(); 
    t2.start();
  } 
 
  static class ThreadA extends Thread{
    public ThreadA(String name){ 
      super(name); 
    } 
    public void run(){ 
      // 获取obj对象的同步锁
      synchronized (obj) {
        for(int i=0; i <10; i++){ 
          System.out.printf("%s [%d]:%d\n", this.getName(), this.getPriority(), i); 
          // i整除4时,调用yield
          if (i%4 == 0)
            Thread.yield();
        }
      }
    } 
  } 
}
로그인 후 복사

(특정 시간) 실행 결과:

t1 [5]:0
t1 [5]:1
t1 [5]:2
t1 [5]:3
t1 [5]:4
t1 [5]:5
t1 [5]:6
t1 [5]:7
t1 [5]:8
t1 [5]:9
t2 [5]:0
t2 [5]:1
t2 [5]:2
t2 [5]:3
t2 [5]:4
t2 [5]:5
t2 [5]:6
t2 [5]:7
t2 [5]:8
t2 [5]:9
로그인 후 복사

결과 설명:
기본 thread 두 개의 스레드 t1과 t2가 메인에서 시작됩니다. t1과 t2는 run()에서 동일한 객체의 동기화 잠금, 즉 동기화(obj)를 참조합니다. t1을 실행하는 동안 Thread.yield()를 호출하더라도 t2는 CPU 실행 권한을 얻지 못합니다. 왜냐하면 t1이 "obj가 보유한 동기화 잠금"을 해제하지 않았기 때문입니다!

스레드 sleep: sleep()
sleep()은 Thread.java에 정의되어 있습니다.
sleep()의 기능은 현재 스레드를 휴면 상태로 만드는 것입니다. 즉, 현재 스레드가 "실행 상태"에서 "휴면(차단) 상태"로 진입하게 됩니다. sleep()은 절전 시간을 지정하며 스레드 절전 시간은 절전 시간보다 크거나 같습니다. 스레드가 다시 깨어나면 "차단 상태"에서 "준비 상태"로 변경되어 대기합니다. CPU의 스케줄링 실행.
예:

class ThreadA extends Thread{
  public ThreadA(String name){ 
    super(name); 
  } 
  public synchronized void run() { 
    try {
      for(int i=0; i <10; i++){ 
        System.out.printf("%s: %d\n", this.getName(), i); 
        // i能被4整除时,休眠100毫秒
        if (i%4 == 0)
          Thread.sleep(100);
      } 
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  } 
} 
 
public class SleepTest{ 
  public static void main(String[] args){ 
    ThreadA t1 = new ThreadA("t1"); 
    t1.start(); 
  } 
}
로그인 후 복사

실행 결과:

t1: 0
t1: 1
t1: 2
t1: 3
t1: 4
t1: 5
t1: 6
t1: 7
t1: 8
t1: 9
로그인 후 복사

결과 설명:
프로그램은 비교적 간단합니다. 메인 스레드 main에서 스레드 t1을 시작합니다. t1이 시작된 후 t1의 계산 i가 4로 나누어지면 t1은 Thread.sleep(100)을 통해 100밀리초 동안 휴면 상태가 됩니다.

sleep()과 wait()의 비교:
wait()의 기능은 현재 스레드를 "실행 중 상태"에서 "대기(차단) 상태"로 진입시키고, 또한 동기화 잠금을 해제합니다. sleep()의 기능은 현재 스레드를 "실행 상태"에서 "절전(차단) 상태"로 전환하는 것입니다.
그러나 wait()는 객체의 동기화 잠금을 해제하지만 sleep()은 잠금을 해제하지 않습니다.
다음 예는 sleep()이 잠금을 해제하지 않음을 보여줍니다.

public class SleepLockTest{ 
 
  private static Object obj = new Object();
 
  public static void main(String[] args){ 
    ThreadA t1 = new ThreadA("t1"); 
    ThreadA t2 = new ThreadA("t2"); 
    t1.start(); 
    t2.start();
  } 
 
  static class ThreadA extends Thread{
    public ThreadA(String name){ 
      super(name); 
    } 
    public void run(){ 
      // 获取obj对象的同步锁
      synchronized (obj) {
        try {
          for(int i=0; i <10; i++){ 
            System.out.printf("%s: %d\n", this.getName(), i); 
            // i能被4整除时,休眠100毫秒
            if (i%4 == 0)
              Thread.sleep(100);
          }
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    } 
  } 
}
로그인 후 복사

실행 결과:

t1: 0
t1: 1
t1: 2
t1: 3
t1: 4
t1: 5
t1: 6
t1: 7
t1: 8
t1: 9
t2: 0
t2: 1
t2: 2
t2: 3
t2: 4
t2: 5
t2: 6
t2: 7
t2: 8
t2: 9
로그인 후 복사

결과 설명:
메인 스레드 main에서 두 스레드 t1 및 t2가 시작되었습니다. t1과 t2는 run()에서 동일한 객체의 동기화 잠금, 즉 동기화(obj)를 참조합니다. t1을 실행하는 동안 Thread.sleep(100)을 호출하더라도 t2는 CPU 실행 권한을 얻지 못합니다. 왜냐하면 t1이 "obj가 보유한 동기화 잠금"을 해제하지 않았기 때문입니다!
Synchronized(obj)를 주석 처리하고 프로그램을 다시 실행하면 t1과 t2가 서로 전환될 수 있습니다. 다음은 syncinized(obj)를 주석 처리한 후의 소스 코드입니다.

public class SleepLockTest{ 
 
  private static Object obj = new Object();
 
  public static void main(String[] args){ 
    ThreadA t1 = new ThreadA("t1"); 
    ThreadA t2 = new ThreadA("t2"); 
    t1.start(); 
    t2.start();
  } 
 
  static class ThreadA extends Thread{
    public ThreadA(String name){ 
      super(name); 
    } 
    public void run(){ 
      // 获取obj对象的同步锁
//      synchronized (obj) {
        try {
          for(int i=0; i <10; i++){ 
            System.out.printf("%s: %d\n", this.getName(), i); 
            // i能被4整除时,休眠100毫秒
            if (i%4 == 0)
              Thread.sleep(100);
          }
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
//      }
    } 
  } 
}
로그인 후 복사


Java의 thread Yield() 및 thread sleep() 메소드에 대한 자세한 기사를 지불하시기 바랍니다. PHP 중국어 웹사이트에 주목하세요!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!