이 장의 내용은 다음과 같습니다.
1. 수율 소개 ()
2. 수율 () 예제
3. 수율 ()와 대기 ()의 비교
1. 수율 소개 ()
수율 ()의 목적은 포기하는 것입니다. 현재 스레드가 "실행 된 상태"에서 "준비 상태"를 입력 할 수 있으므로, 우선 순위가 동일한 대기 스레드는 실행 권한을 얻을 수 있지만, 현재 스레드가 axption ()을 호출 한 후에는 다른 실행을 얻을 수 있습니다. 동일한 우선 순위가 있습니다. 스레드는 확실히 실행 권한을 얻을 수 있습니다.
2. 수율 () 예제
아래에서 예제별 사용을 참조하십시오.
코드 사본은 다음과 같습니다.
// aquiledtest.java 소스 코드
클래스 스레드는 스레드를 확장합니다 {
public threada (문자열 이름) {
슈퍼 (이름);
}
public synchronized void run () {
for (int i = 0; i <10; i ++) {
System.out.printf ( "%s [%d] :%d/n", this.getName (), this.getPriority (), i);
// 4를 나누면 호출을 호출하십시오
if (i%4 == 0)
thread.yield ();
}
}
}
공개 클래스 수율 테스트 {
public static void main (String [] args) {
Threada t1 = 새로운 Threada ( "T1");
Threada t2 = 새로운 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"로 전환되지 않습니다. 이는 수율 ()이 "실행 상태"에서 "준비 상태"를 입력 할 수 있지만 반드시 다른 스레드가 CPU 실행 권한을 얻을 수는 없음을 보여줍니다 (즉, 다른 스레드는 "실행 상태"에 들어갑니다. 이 "다른 스레드"가 현재 수율 ()을 호출하는 스레드와 동일한 우선 순위를 갖더라도.
3. 수율 ()와 대기 ()의 비교
Wait ()의 함수는 현재 스레드가 "실행 상태"에서 "대기 (차단) 상태로 들어가고 동기화 잠금을 해제하는 것임을 알고 있습니다. 수율 ()의 함수는 포기하는 것이며, 이로 인해 현재 스레드가 "실행 상태"를 남기게됩니다. 그들의 차이점은 다음과 같습니다.
(01) 대기 ()는 스레드가 "실행 상태"에서 "대기 (차단) 상태"로 들어가게하는 반면, 율은 없음 ()은 스레드가 "실행 된 상태"에서 "Ready State"에 들어가도록하는 것입니다.
(02) Wait ()는 보유한 객체를 실행하는 스레드를 방출하는 동기화 잠금 장치이며, 수율 () 메소드는 잠금을 해제하지 않습니다.
다음 예제는 수율 ()이 잠금을 해제하지 않는다는 것을 보여줍니다.
코드 사본은 다음과 같습니다.
// OquibleLockTest.java 소스 코드
공개 클래스 수율 락 테스트 {
개인 정적 객체 obj = new Object ();
public static void main (String [] args) {
Threada t1 = 새로운 Threada ( "T1");
Threada t2 = 새로운 Threada ( "T2");
t1.start ();
t2.start ();
}
정적 클래스 스레드는 스레드를 확장합니다.
public threada (문자열 이름) {
슈퍼 (이름);
}
public void run () {
// OBJ 객체의 동기화 잠금을 가져옵니다
동기화 (OBJ) {
for (int i = 0; i <10; i ++) {
System.out.printf ( "%s [%d] :%d/n", this.getName (), this.getPriority (), i);
// 4를 나누면 호출을 호출하십시오
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
결과 설명 :
메인 스레드 메인에서 두 개의 스레드 T1과 T2가 시작됩니다. T1과 T2는 run (), 즉 동기화 된 (OBJ)의 동일한 객체의 동기화 잠금을 나타냅니다. T1 작업 중에는 THREAD.YILD ()을 호출합니다. T1은 "OBJ가 보유한 동기 잠금"을 해제하지 않기 때문입니다!