이 장의 내용은 다음과 같습니다.
1. 수면 소개 ()
2. 수면 () 예제
3. 수면 ()와 대기 ()의 비교
1. 수면 소개 ()
sleep ()는 thread.java에 정의됩니다.
Sleep ()의 기능은 현재 스레드 수면, 즉 현재 스레드가 "실행 상태"에서 "수면 (차단) 상태"로 들어가게하는 것입니다. 수면 ()은 수면 시간을 지정하며 실이 다시 깨어날 때 실이 수면 시간보다 크거나 동일합니다. CPU는 실행 될 예정입니다.
2. 수면 () 예제
다음은 수면 사용을 보여주는 간단한 예입니다 ().
코드 사본은 다음과 같습니다.
// sleeptest.java의 소스 코드
클래스 스레드는 스레드를 확장합니다 {
public threada (문자열 이름) {
슈퍼 (이름);
}
public synchronized void run () {
노력하다 {
for (int i = 0; i <10; i ++) {
System.out.printf ( " %s : %d/n", this.getName (), i);
// 4로 나눌 수 있으면 100 밀리 초 동안 잠을 자십시오.
if (i%4 == 0)
Thread.sleep (100);
}
} catch (InterruptedException e) {
e.printstacktrace ();
}
}
}
공개 수면 수면 테스트 {
public static void main (String [] args) {
Threada t1 = 새로운 Threada ( "T1");
t1.start ();
}
}
실행 결과 :
코드 사본은 다음과 같습니다.
T1 : 0
T1 : 1
T1 : 2
T1 : 3
T1 : 4
T1 : 5
T1 : 6
T1 : 7
T1 : 8
T1 : 9
결과 설명 :
이 프로그램은 비교적 간단합니다. 메인 스레드 메인의 스레드 T1을 시작하십시오. T1이 시작된 후, T1의 계산 I을 4로 나눌 수있을 때, T1은 Thread.sleep (100)를 통해 100 밀리 초 동안 잠을 자게됩니다.
수면 ()와 대기 ()의 비교
Wait ()의 함수는 현재 스레드가 "실행 상태"에서 "대기 (차단) 상태로 들어가고 동기화 잠금을 해제하는 것임을 알고 있습니다. Sleep ()의 기능은 현재 실이 "실행 상태"에서 "수면 (차단) 상태"에 들어가도록하는 것입니다.
그러나 대기 ()는 객체의 동기화 잠금을 풀고 sleep ()는 잠금을 해제하지 않습니다.
다음 예는 Sleep ()가 잠금 장치를 방출하지 않는다는 것을 보여줍니다.
코드 사본은 다음과 같습니다.
// SleePlockTest.java의 소스 코드
공개 클래스 SleePlockTest {
개인 정적 객체 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/n", this.getName (), 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
결과 설명 :
메인 스레드 메인에서 두 개의 스레드 T1과 T2가 시작됩니다. T1과 T2는 run (), 즉 동기화 된 (OBJ)의 동일한 객체의 동기화 잠금을 나타냅니다. T1이 실행 중이지만 Sleep.Sleep (100)는 CPU 실행 권한을 얻지 못합니다. T1은 "OBJ가 보유한 동기 잠금"을 해제하지 않기 때문입니다!
동기화 된 (OBJ)를 주석하고 프로그램을 다시 실행하면 T1과 T2를 서로 전환 할 수 있습니다. 다음은 댓글 조정 (OBJ)의 소스 코드입니다.
코드 사본은 다음과 같습니다.
// SleePlockTest.java 소스 코드 (댓글 동기화 (OBJ))
공개 클래스 SleePlockTest {
개인 정적 객체 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/n", this.getName (), i);
// 4로 나눌 수 있으면 100 밀리 초 동안 잠을 자십시오.
if (i%4 == 0)
Thread.sleep (100);
}
} catch (InterruptedException e) {
e.printstacktrace ();
}
//}
}
}
}