2012-07-17 5 views
4

이 클래스에서 정적 메서드 호출 및 출력을 살펴보십시오.단일 스레드에서 정적 메서드에 대한 많은 호출이

public class OneThreadManyStaticCalls { 

public static final Calculator calculator = new Calculator(); 
    public static void main(String[] args) { 
     dummy(0, 1, 1); 
     dummy(0, 2, 2); 
     dummy(0, 3, 5); 
     dummy(0, 4, 44); 
     dummy(0, 5, 5); 
    } 

    public static void dummy(int a, int b, int expected) { 

     System.out.print(System.currentTimeMillis() + "\t"); 
     if (calculator.add(a, b) == expected) { 
      System.out.println("OK"); 
     } else { 
      System.err.println("NOK"); 
     } 
    } 
} 

이 프로그램을 실행하는 다른 시스템 (system.out.print에서 주문)을 받았습니다. 예 :

NOK 
    NOK 
    1342527389506 OK 
    1342527389506 OK 
    1342527389506 1342527389506 1342527389506 OK 

(세부 사항 포함) 이유는 무엇입니까? 미리 감사드립니다. sznury

답변

12

System.err과 System.out은 콘솔 창에서 인터리브 된 두 가지 스트림으로, 반드시 동기화되어 있지는 않습니다. System.*.flush() (아무렇지도 않은 것으로 보이지만 작동하지 않는 것 같습니다)을 사용하여 출력을 처리하거나 모든 출력을 동일한 스트림으로 인쇄하십시오.

public static void dummy(int a, int b, int expected) { 
    System.out.print(System.currentTimeMillis() + "\t"); 
    if ((a + b) == expected) { // I don't have your Calculator :< 
     System.out.println("OK"); 
    } else { 
     System.out.println("NOK"); 
    } 
} 

1342528255764 OK 
1342528255764 OK 
1342528255764 NOK 
1342528255764 NOK 
1342528255764 OK 
1

@Jacob Raihle이 사건은 System.out에

public static void dummy(int a, int b, int expected) { 
    System.out.print(a+" "+b+" = "+expected); 
    if((a+b)==expected) 
     System.out.println(" OK"); 
    else 
     System.out.println(" NOK"); 

} 
2

더 간단한 예에 System.err에 통화를 변경할 것을 보여주기 위해 올바른이 결과를 제공합니다 is

for (int i = 0; i <= 20; i++) 
    (i % 2 == 0 ? System.out : System.err).println(i); 

있습니다 두 스트림이 콘솔에 모두 연결되어 있어도 두 스트림간에 순서가 보장되지 않습니다. 하나 개의 실행 (각 실행으로 변경)

1 
0 
3 
2 
5 
4 
7 
6 
9 
8 
11 
10 
13 
12 
15 
14 
17 
16 
19 
18 
20 

참고

인쇄 다음 System.err에 선이 빨간색

+0

에 표시 내 IDE에서 당신은 아마 의미 "순서의 보장은 없습니다" – assylias

+0

@assylias 했어, 고마워. –