2013-05-16 2 views
4

더 나은 자바 스레딩을 이해하기 위해, 나는 다음과 같은 코드를 작성단일 코어 CPU에서 스레딩이 작동하는 이유는 무엇입니까?

public class SimpleRunnableTest { 
    public static void main(String[] args) throws InterruptedException { 
     long start = System.currentTimeMillis(); 

     Thread t1 = new Thread(new TT1()); 
     t1.start(); 
     Thread t2 = new Thread(new TT2()); 
     t2.start(); 

     t2.join(); 
     t1.join(); 

     long end = System.currentTimeMillis(); 
     System.out.println("end-start="+(end-start)); 
     } 
} 
class TT1 implements Runnable { 
    public void run(){ 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

class TT2 implements Runnable { 
    public void run() { 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
}  

내가 스레딩을 사용하고 있기 때문에 내가 Thread.sleep(5000)main 스레드에서 Thread.sleep(1000) 순차적으로, 소비되는 시간이 6 sec 것 실행할 수 있지만 경우 아이디어는, 그것을 멀티 코어 CPU 시스템에 대해서만 5 sec의 비용이들 것입니다. 하지만 내 질문은 :

결과가 여전히 단일 코어 CPU 컴퓨터에서 5 sec 인 이유는 무엇입니까? 물론 스레딩이 사용되지만, 단지 시분할 멀티플렉싱을 통한 스레딩이 아닙니다.?

시분할 다중화에 대한 나의 이해는 다음과 같습니다. Thread.sleep(5000)은 작업 A이고 Thread.sleep(1000)은 작업 B이며 A1 : A2, A3; B1, B2

단지 순차입니다 : 중, A1, A2, A3가, B1, B2

시간 분할 다중 스레딩 그냥되는 :이 경우 A1, B1, A2, B2, A3

, 어떻게 올 첫 번째 비용은 6 초이고 두 번째 비용은 5입니다.

여기 기지가 있습니까?

+6

슬립 모드로 전환되면 스레드 컨텍스트 전환이 발생하고 다른 하나는 실행됩니다 (또한 슬립 모드로 전환됨). –

+0

스레드 구현은 시스템 빌더에 따라 다르며 한 시스템에서는 녹색이고 다른 시스템에서는 보라색입니다. 어느 것을 선호합니까? –

답변

11

두 스레드가 동시에 절전 모드 일 수 있으므로 결과는 5가 아니라 6입니다. Thread.sleep()을 호출하여 잠자기 상태가되면 다른 스레드가 실행될 수 있지만 나머지 잠자기 간격 타이머는 두 스레드에 계속 똑딱 거리게됩니다.

이 기능은 절전 모드 (거의 0의 CPU 사용)에만 적용되지만 유용한 작업을 수행하는 데는 적용되지 않습니다.이 경우 단일 코어 비 하이퍼 스레딩 CPU의 타이밍이 실제로 추가 될 수 있습니다. 예를 들어, 한 스레드가 5 초의 수의 처리를 필요로하고 다른 스레드가 두 번째의 수의 처리를 필요로하는 경우 두 스레드의 총 시간은 6 초가됩니다.

+0

아, 좋은 지적입니다. 시험해 보겠습니다. – Will

+1

테스트를 마쳤습니다. 태스크가 휴면이 아닌 실제 태스크 인 경우 스레딩은 '단일 코어 비 하이퍼 스레딩 CPU'에서 소비 한 총 시간에 영향을 미치지 않습니다. 도움을 주셔서 감사합니다. – Will

1

Thread.sleep (sleeptime)을 호출하면 Thread가 적어도 'sleeptime'밀리 초 동안 CPU가 필요 없다는 신호를 보냅니다.

그 동안 다른 스레드가 실행될 수 있습니다.

+0

그러나 그들은 동시에 정말로 잠을 잘 수 없습니다 '맞지? CPU 수준에서 '같은 시간'은 '시분할 다중화'에 의해 달성됩니다. 즉, 잠시 동안 잠이 들었다가 B, A, B가 차례로 발생하는 것을 의미합니다. 시간 간격이 각각의 쓰레드가 작아서 동시에 '잠자는'것 같은 환상을 만들어 낸다. 이것이 단일 코어 CPU에서 처음으로 멀티 쓰레딩을 달성 한 방법이 아닌가? 어쨌든 한 CPU가 한 번에 여러 명령을 실행할 수 없기 때문에 그렇습니까? – Will

+0

"sleep"여기는 "do nothing"과 동의어입니다. 두 스레드가 아무 것도하지 않으면 병렬로 수행 할 수 없습니다. 또한 파이프 라인과 예측을 사용하는 현재 CPU 설계는 단일 코어에서조차도 많은 양의 병렬 작업을 수행합니다. – mschenk74