스레드 양보 : 수율 ()
수율 ()의 목적은 포기하는 것입니다. 현재 스레드가 "실행 상태"에서 "준비 상태"를 입력 할 수 있으므로, 동일한 우선 순위를 가진 다른 대기 스레드가 실행 권한을 얻을 수 있습니다. 그러나 현재 스레드가 Caliple ()을 호출 한 후에는 동일한 우선 순위를 가진 다른 스레드가 분명히 실행 권한을 얻을 것이라고 보장 할 수는 없습니다. 또한 현재 스레드가 "실행 상태"로 들어가서 계속 실행될 수 있습니다!
예:
클래스 스레드는 스레드 {public threada (문자열 이름) {super (name); } public synchronized void run () {for (int i = 0; i <10; i ++) {system.out.printf ( "%s [%s [%s [%d] :%d/n", this.getName (), this.getPriority (), i); // 내가 4로 나뉘어지면 (i%4 == 0) thread.yield (); }}} public class arquemtest {public static void main (String [] args) {Threada t1 = new Threada ( "T1"); Threada t2 = 새로운 Threada ( "T2"); t1.start (); t2.start (); }} (한 번) 작동 결과 :
T1 [5] : 0T2 [5] : 0T1 [5] : 1T1 [5] : 2T1 [5] : 3T1 [5] : 4T1 [5] : 5T1 [5] : 6T1 [5] : 7T1 [5] : 8T1 [5] : 9T2 [5] : 1T2 [5] : 2T2 [5] : 3T2 [5] : 4T2 [5] : [5] : 6T2 [5] : 7T2 [5] : 8T2 [5] : 9
결과 설명 :
"스레드 T1"이 4로 정수 될 수있는 경우 "스레드 T2"로 전환되지 않습니다. 이는 수율 ()이 "실행 상태"에서 스레드가 "준비 상태"를 입력 할 수 있지만, 다른 스레드가 현재 "다른 스레드"가 현재 호수를 호출하는 스레드와 동일한 우선 순위를 가지고 있더라도 다른 스레드가 CPU 실행 권한 (즉, 다른 스레드가 "실행 상태"에 들어갈 수는 없음)을 허용 할 수는 없음을 보여줍니다.
수율 () 및 대기 () 비교 :
Waite ()의 기능은 현재 스레드가 "실행 상태"에서 "대기 (차단) 상태로 들어가고 동기화 잠금을 해제 할 수 있도록하는 것임을 알고 있습니다. 수율 ()의 기능은 포기하는 것입니다.
(1) 대기 ()는 스레드가 "실행 상태"에서 "대기 (차단) 상태"에 들어가도록하는 반면, Not lection ()는 스레드가 "실행 된 상태"에서 "Ready State"에 들어가도록하는 것입니다.
(2) Wait ()는 스레드가 보유하는 객체를 해제하는 동기화 잠금 장치이며, 수율 () 메소드는 잠금을 해제하지 않습니다.
다음 예제는 수율 ()가 잠금을 해제하지 않는다는 것을 보여줍니다.
public class aquiledlocktest {private static object obj = new Object (); public static void main (String [] args) {Threada t1 = new Threada ( "T1"); Threada t2 = 새로운 Threada ( "T2"); t1.start (); t2.start (); } static class streada는 stread {public threada (문자열 이름) {super (name); } public void run () {// get synchronized (obj) {for (int i = 0; i <10; i ++) {system.out.printf ( "%s [%s [%d] :%d/n", this.getName (), this.getPriority (), i); // 내가 4로 나뉘어지면 (i%4 == 0) thread.yield (); }}}}}} (한 번) 결과 :
T1 [5] : 0T1 [5] : 1T1 [5] : 2T1 [5] : 3T1 [5] : 4T1 [5] : 5T1 [5] : 6T1 [5] : 7T1 [5] : 8T1 [5] : 9T2 [5] : 0t2 [5] : 1T2 [5] : 2T2 [5] : 3T2 [5] : 4T2 [5] : [5] : 6T2 [5] : 7T2 [5] : 8T2 [5] : 9
결과 설명 :
메인 스레드 메인에서 두 개의 스레드 T1과 T2가 시작됩니다. T1과 T2는 run (), 즉 동기화 된 (OBJ)의 동일한 객체의 동기화 잠금을 나타냅니다. T1 작업 중에는 thread.yield ()를 호출하지만; T2는 CPU 실행 권한을 얻지 못합니다. T1은 "OBJ가 보유한 동기 잠금"을 해제하지 않기 때문입니다!
스레드 수면 : 수면 ()
sleep ()는 thread.java에 정의됩니다.
Sleep ()의 기능은 현재 스레드 수면, 즉 현재 스레드가 "실행 상태"에서 "수면 (차단) 상태"로 들어가게하는 것입니다. 수면 ()은 수면 시간을 지정하며 실로 수면 시간은 수면 시간보다/동일합니다. 스레드가 다시 깨어나면 CPU가 실행되기를 기다리는 "차단 상태"에서 "준비 상태"로 변경됩니다.
예:
클래스 스레드는 스레드 {public threada (문자열 이름) {super (name); } public synchronized void run () {try {for (int i = 0; i <10; i ++) {system.out.printf ( " %s : %d/n", this.getName (), i); // 4로 나눌 수 있으면 100ms의 경우 (i%4 == 0) stread.sleep (100); }} catch (InterruptedException e) {e.printstacktrace (); }}} public class sleeptest {public static void main (String [] args) {Threada t1 = new Threada ( "T1"); t1.start (); }} 실행 결과 :
T1 : 0T1 : 1T1 : 2T1 : 3T1 : 4T1 : 5T1 : 6T1 : 7T1 : 8T1 : 9
결과 설명 :
이 프로그램은 비교적 간단합니다. 메인 스레드 메인의 스레드 T1을 시작하십시오. T1이 시작된 후, T1의 계산 I을 4로 나눌 수있을 때, T1은 Thread.sleep (100)를 통해 100 밀리 초 동안 잠을 자게됩니다.
수면 () 및 대기 () 비교 :
Wait ()의 함수는 현재 스레드가 "실행 상태"에서 "대기 (차단) 상태로 들어가서 동기화 잠금을 해제 할 수 있도록하는 것임을 알고 있습니다. Sleep ()의 함수는 현재 스레드가"실행 상태 "에서"수면 (차단) 상태 "에 들어가도록하는 것입니다.
그러나 대기 ()는 객체의 동기화 잠금을 풀고 sleep ()는 잠금을 해제하지 않습니다.
다음 예는 Sleep ()가 잠금 장치를 방출하지 않는다는 것을 보여줍니다.
public class sleeplocktest {private static object obj = new Object (); public static void main (String [] args) {Threada t1 = new Threada ( "T1"); Threada t2 = 새로운 Threada ( "T2"); t1.start (); t2.start (); } static class streada는 stread {public threada (문자열 이름) {super (name); } public void run () {// obj 객체 동기화 (obj)의 동기화 잠금을 가져옵니다 (obj) {try {for (int i = 0; i <10; i ++) {system.out.printf ( " %s : %d/n", this.getName (), i); // 4로 나눌 수 있으면 100ms의 경우 (i%4 == 0) stread.sleep (100); }} catch (InterruptedException e) {e.printstacktrace (); }}}}}}}}}} 실행 결과 :
T1 : 0T1 : 1T1 : 2T1 : 3T1 : 4T1 : 5T1 : 6T1 : 7T1 : 8T1 : 9T2 : 0T2 : 1T2 : 2T2 : 3T2 : 4T2 : 5T2 : 6T2 : 7T2 : 8T2 : 9
결과 설명 :
메인 스레드 메인에서 두 개의 스레드 T1과 T2가 시작됩니다. T1과 T2는 run (), 즉 동기화 된 (OBJ)의 동일한 객체의 동기화 잠금을 나타냅니다. T1이 실행 중이지만 Thread.Sleep (100)를 호출합니다. T2는 CPU 실행 권한을 얻지 못합니다. T1은 "OBJ가 보유한 동기 잠금"을 해제하지 않기 때문입니다!
동기화 된 (OBJ)를 주석하고 프로그램을 다시 실행하면 T1과 T2를 서로 전환 할 수 있습니다. 다음은 댓글 조정 (OBJ)의 소스 코드입니다.
public class sleeplocktest {private static object obj = new Object (); public static void main (String [] args) {Threada t1 = new Threada ( "T1"); Threada t2 = 새로운 Threada ( "T2"); t1.start (); t2.start (); } static class streada는 stread {public threada (문자열 이름) {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); // 4로 나눌 수 있으면 100ms의 경우 (i%4 == 0) stread.sleep (100); }} catch (InterruptedException e) {e.printstacktrace (); } //}}}}