[문제] 우리는 클래스를 제공합니다 :
클래스 FOOBAR { 공개 무효 foo는 () { 위해 ( int로 I = 0 ; I <N은, 내가 ++ ) { 인쇄 ( " foo는 " ); } } 공개 공극 바 () { 위해 ( int로 I = 0 ; I <N은, 내가 ++ ) { 인쇄 ( " 바 " ); } } }
두 개의 서로 다른 스레드는 FOOBAR 예를 공유합니다. 하나 개의 스레드가 foo는 () 메소드를 호출, 다른 스레드 바 () 메소드를 호출 할 것이다.
"는 foobar"출력 n 번 있는지 확인하기위한 프로그램을 수정하십시오.
예 1 : 입력 : N- = . 1 개 출력 : " 는 foobar " 설명 : 비동기 적으로 시작되는 두 개의 스레드가 있습니다. () 호출 방법으로 foo에있어서, 다른 통화 표시 줄 () 메소드는, " 는 foobar " 한 번 출력됩니다.
예 2 : 입력 : N- = 2 출력 : " foobarfoobar는 " 설명 : " 는 foobar는 " 두 번 출력된다.
[설명]
공공 클래스 는 foobar { 개인 INT N-; // OBJ 로크 대상 개인 오브젝트 OBJ; // COUNT는 0 내지 2 %의 인쇄 foo를 같은지, 인쇄를 한 바 같다 개인 정적 INT의 COUNT = 0 ; 공개 FOOBAR ( INT의 N) { 이 .N = N; OBJ = 새 개체 (); } 공개 공극 foo는 (Runnable를 printFoo)이 발생 예외 : InterruptedException { 위해 ( int로 I = 0 ; I <N은, 내가 ++ ) { 동기 (OBJ) { // COUNT. 1 % 2 == 바는, 인쇄되어야하므로 수면에, 잠금 해제는 IF (COUNT %의 2 == . 1 ) { obj.wait (); } // COUNT % 2 == 0 깨어 인쇄 foo에 printFoo.run (); COUNT ++ ; // 인쇄 마무리 foo는, 이후에 걸쳐 인쇄 줄로 이동한다 ) (obj.notify; } } } 공개 공극 바 (실행 가능한 프린트 바)는 예외 : InterruptedException {발생 // 되는 메소드 foo에의 이행을 보장하기 위하여 10 ms 동안 잠 Thread.sleep를 ( 10 ) 에 대해 ( int로 난 = 0 ; I는 <N-; I는 ++를 ) { 동기 (OBJ) { 만약 (% 계수 2를 == 0 ) { obj.wait (); } printBar.run (); 카운트 ++ ; obj.notify (); } } } // 코드 테스트 공용 정적 무효 {메인 (문자열 []를 인수) FOOBAR의 FB = 새로운 FOOBAR ( 3 ); printFoo foo는 = 새로운 printFoo (); 인쇄 바 = 새로운 인쇄 (); // 스레드 인쇄 foo는 만들 익명의 내부 클래스 새 새 스레드 () { 공공 무효 RUN () { 은 try { fb.foo (foo는); } 캐치 (의 InterruptedException E) { // TODO 자동 생성 캐치 블록 e.printStackTrace (); } } }.스타트(); // 익명의 내부 클래스와 스레드 인쇄 바 만들 새 새 () {스레드를 공공 무효 RUN () { 은 try를 { fb.bar (바); } 캐치 (의 InterruptedException E) { // TODO 자동 생성 캐치 블록 e.printStackTrace (); } } }.스타트(); } }