2017-11-12 7 views
0

다음 코드가 있습니다. 주 스레드가 다른 스레드를 시작합니다. 7 초 후에 주 스레드는 다른 스레드를 인터럽트합니다.IntellijIdea 콘솔 대기 시간

Sleeping #0 
Sleeping #1 
Interrupted 
Sleeping #2 
java.lang.InterruptedException: sleep interrupted 
    at java.lang.Thread.sleep(Native Method) 
    at com.company.Main$1.run(Main.java:16) 
    at java.lang.Thread.run(Thread.java:748) 
Sleeping #3 
... and so on 

그것은 첫째 인쇄 "Interrupted"

Sleeping #0 
Sleeping #1 
Interrupted 
java.lang.InterruptedException: sleep interrupted 
    at java.lang.Thread.sleep(Native Method) 
    at com.company.Main$1.run(Main.java:16) 
    at java.lang.Thread.run(Thread.java:748) 
Sleeping #2 
Sleeping #3 
... and so on 

하지만 내가 얻을 것은 :

package com.company; 

public class Main { 

    public static void main(String[] args) { 

     Thread t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       for (int i = 0; i < 10; i++) 
       { 
        System.out.println("Sleeping #" + i); 
        try { 
         Thread.sleep(5000); 
        } catch (InterruptedException e) { 
         System.out.println("Interrupted"); 
         e.printStackTrace(); 
         continue; 
        } 
       } 
      } 
     }); 
     t.start(); 
     try { 
      Thread.sleep(7000); 
      t.interrupt(); 
     } catch (InterruptedException e) {} 
    } 
} 

나는 같은 출력을 얻을 것으로 예상. 그런 다음 다음 반복의 출력 " Sleeping #2"을 입력 한 다음 스택 추적을 인쇄합니다. 왜 그렇게됩니까? 스택 트레이스 인쇄 대기 시간이있는 것 같습니다. IntelliJ Idea는 콘솔 관련 문제입니까? 네이티브 콘솔에서 프로그램을 실행하면 잘 작동하기 때문입니다.

+1

을 사용하십시오. 'printStacktrace'는 stdout 대신 stderr로 출력 할 수 있습니다. 콘솔은 인터리브 방식에 대한 보장을 실제로 제공하지 않습니다. – pvg

+0

@pvg, 그럼? 이유가 있다면 콘솔에서 실행할 때 왜 제대로 작동합니까? –

+2

'그렇게'는 무엇을 의미합니까? 두 가지 스트림이 있습니다. 하나의 터미널 또는 다른 터미널이 이들을 인터리빙하는 방법은 구현에 따라 다릅니다. 엄격하게 순차적 인 출력을 얻으려면 동일한 스트림으로 출력하십시오. – pvg

답변

2

System.out.printlnstdout으로, Throwable.printStackTracestderr으로 출력됩니다. 단말기 구현은 각각 독립적으로 버퍼링 할 수 있으며 각 스트림의 출력이 인터리브되는 방식은 잘 정의되어 있지 않습니다.

주어진 스레드의 출력이 엄격하게 순차적으로 표시되도록하려면 모든 출력을 동일한 스트림으로 지정하십시오. 귀하의 경우에는 인쇄물을 System.err으로 변경하거나 Throwable.printStackTrace(System.out)