[Leetcode] 대체 인쇄 FOOBAR

[문제] 우리는 클래스를 제공합니다 :

클래스 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 ();
                }
            }
        }.스타트();
    }
}

 

추천

출처www.cnblogs.com/zhudingtop/p/11668009.html