기금넷 공식사이트 - 복권 조회 - 자바 스레드, while () 괄호는 false 로 판단됩니다. 왜 while 루프를 실행합니까?

자바 스레드, while () 괄호는 false 로 판단됩니다. 왜 while 루프를 실행합니까?

이 문제는 확률에 달려 있다.

복권 500W 를 살 확률이 원하는 효과를 얻을 수 있어요. ᄏ

문제는 주로 다음과 같습니다.

이것은 네가 전화해서 자는 것과는 별로 관계가 없다.

주 스레드는 처음부터 하위 스레드를 시작하여 두 스레드가 동시에 CPU 시간 슬라이스를 선점합니다.

대부분의 경우 하위 스레드는 다음 명령문을 실행할 때 실행 및 인쇄를 유지합니다.

System.out.println ("-"+newdate ()+"-");

주 스레드가 타임 슬라이스를 빼앗았고, 주 스레드가 다시 실행되기 시작했고, 주 스레드가 실행되는 동안 플래그가 마침 false 로 설정되었습니다.

그런 다음 하위 스레드는 타임 슬라이스를 잡고 실행을 시작하고 플래그를 인쇄합니다. 플래그의 값이 주 스레드에 의해 수정되었기 때문에 인쇄의 결과는 거짓임이 분명합니다. 여기서 중요한 점은 하위 스레드가 플래그 값을 인쇄할 때 하위 스레드가 while 판단을 전혀 하지 않는다는 것입니다. 하위 스레드가 지난번에 판단을 통과했기 때문에 하위 스레드가 약간 말을 듣지 않고 다시 한 번 실행되었기 때문입니다.

사실, "플래그가 이미 거짓이고 while 의 문이 계속 실행됩니다." 라는 말이 사실이라면, 5 줄 이상의 인쇄 효과를 볼 수 있을 것입니다. 그리고 반드시 사순환의 인쇄가 아닐까요? (시드 비셔스, Northern Exposure (미국 TV 드라마), 죽음명언)

간단한 수정은 다음과 같을 수 있습니다.

공용 클래스 테스트 중단 {

공용 정적 void main(String[] args) {

Myth read mt = new myth read ();

Mt.start ();

시도 {

//thread.sleep (1000);

System.out

。 Println(Thread.currentThread ()) 을 참조하십시오. GetName()+"실행 중));

} catch (예외 e) {

}

동기화 (mt.flag) {

Mt.flag = false

}

}

}

클래스 MyThread 확장 스레드 {

부울 플래그 = 참;

공용 잘못된 실행 () {

While (참) {

동기화 (플래그) {

만약 (! 로고) {

System.out.println ("플래그가 false, exit");

깨뜨리다

}

System.out.println (thread.currentthread ()). GetName ()

+"실행 중");

System.out.println ("-"+newdate ()+"-");

시도 {

//수면 (2000);

System.out.println (flag);

System.out.println ("* * *"+thread.currentthread (). GetName ()

+"는"+"* * *" 를 실행하는 것입니다.

} catch (예외 e) {

깨뜨리다

}

}

}

}

}

가능할 것 같아요. 테스트가 없어요.