2015-01-25 3 views
0

나는 비슷한 질문을 보았다. 그러나 나는 내 것이 중복되지 않는다고 생각한다.Thread.sleep() 메서드는 어떻게 작동합니까?

public static void main(String[] args) throws InterruptedException { 
    Thread t1 = new Thread() { 
     public void run() { 
      System.out.println("t1"); 
     } 
    }; 

    Thread t2 = new Thread() { 
     public void run() { 
      System.out.println("t2"); 
     } 
    }; 


    t1.start(); 
    Thread.sleep(1000); 
    t2.start(); 
    Thread.sleep(1000); 

    System.out.println("main"); 
} 

는 왜 같은 순서로 항상 스레드 이름을 인쇄 않습니다 나는이 예제를 이해할 수 없다?

t1 
//1 sec pause 
t2 
//1 sec pause 
main 

Thread.sleep(1000) 스레드 t2t1.start()의 대기는 무엇입니까? t2가 즉시 실행 방법의 실행을 시작하지 않는 이유는 무엇입니까?

+1

당신은 T2 두 번째이 경과 할 때까지 시작되지 않는 이유입니다 잠을 때까지't2'을 시작하지 않습니다. –

답변

3

프로그램을 실행하면 (Thread.start) 프로그램을 문자열 (Thread)로 생각하십시오 해당 문자열 (귀하의 코드)에 구슬을 배치하십시오. 이것은 당신이 잠시 (Thread.sleep) 지정한 시간 동안 그 실 조각을 내려 놓는 것과 같아서, 더 이상 구슬을 두지 않는다는 것을 의미합니다. 이해가 안되네.)

첫 번째 스레드 (main)를 얻은 다음 2 개의 새 스레드 (t1, t2)를 시작했지만 Thread.start()를 호출 할 때 기능적으로 작동하지 않습니다. 현재 기능 스레드 (주)는 해당 스레드의 모든 활동을 1 초 동안 일시 중지하는 절전 명령을 가지고 있습니다. 그래서 프로그램은 다음과 같이 주문됩니다 : 1 번과 2 번 (t1, t2) 생성, 1 번 스레드 시작 (1 번), 1 초 동안 일시 중지 한 다음 스레드 2 (t2)를 시작한 다음 1 초 동안 일시 중지 한 다음 문자열을 인쇄하십시오 "본관";

2

이 코드의 sleep 메서드는 main()이 실행중인 스레드가 다른 스레드를 시작한 후 다음 스레드를 시작하는 데 1 초간 일시 중지하기 때문입니다.

2

프로그램이 그것 "메인"스레드에서 시작 시작 ,

호출은 "Thread.start는()"포크 실행 (원인이 병렬로 시작 T1)를 선택한 다음, "메인"스레드에게 1 초 동안 잠자기하고 두 번째 스레드를 시작한 다음 마지막으로 "Main"을 인쇄하십시오

0

t2을 아직 시작하지 않았기 때문에 이 아직 시작되지 않았고 t1이 시작된 것 같습니다.

두 명의 비서 앨리스와 밥을 생각해보십시오. 당신은 당신이 그들의 이름을 말할 때 그들의 이름을 말함으로써 응답해야한다고 두 사람에게 이야기합니다. 현재 실행은 다음과 같습니다

  1. 당신이 말하는 앨리스
  2. 기다립니다 1 초 당신은 밥
  3. 대기가
  4. 당신은 자신의 이름

앨리스는 그녀와 함께 응답 초라고 한 말을

  • 당신이 기다리는 동안 일어나는 앨리스 (Alice)를 말할 때 이름. 밥이 기다리고있는 것처럼 보입니다. 그리고 그는 자신의 이름을 말하기를 기다리고 있습니다. 물론 앨리스는 언제나 (또는 ​​거의 항상) 밥보다 먼저 그녀의 이름을 말할 것입니다. Alice가 그녀의 이름을 듣고 친절하게 대답하는 데는 1 초도 걸리지 않습니다.다음 실행과 명암이 :

    1. 을 당신은 앨리스가
    2. 당신은 밥
    3. 대기 2 초
    4. 당신은 자신의 이름이 패러다임에서

    , 그렇게하지 말 말 말 실제로 어느 이름이 먼저 나올지를 안다. 당신은 앨리스를 먼저 말했지만 두 사람은 그들 사이에 공간이 없으므로 앨리스와 밥 중 어느 쪽이 더 빠른 반사 작용을하는지에 달려 있습니다. thread2는()를 호출의 시작 때까지 실행 상태가 아닌

    t1.start(); 
    t2.start(); 
    Thread.sleep(2000); 
    System.out.println("main"); 
    
    0
    1. :에이 해당한다.
    2. 첫 번째 Thread.sleep (1000)은 주 스레드를 일시 중지합니다. 당신이 무엇을 기대 할 수 있습니다 수정
    3. 다음 코드 :

      thread1.start(); 
      thread2.start(); 
      Thread.sleep(2000); 
      
    관련 문제