2012-02-22 5 views
-1

두 개의 스레드가 있습니다. 먼저 하나 (SocketThread)를 호출하고 그 중 하나에서 다른 스레드 ('ProcessThread')를 호출합니다. 내 문제는 실행하는 동안 CPU 사용률이 50 %라는 것입니다. ProcessThread run 메서드에 TimeUnit.NANOSECONDS.sleep(1)을 추가하면 0 %로 감소합니다. 이것은 올바른 수정 방법입니까? 또는 CUP 활용을 줄이기위한 일반적인 조언. 다음은 자바 스레드 - 높은 CPU 사용률?

내 코드입니다 :

public class SocketThread extends Thread { 
    private Set<Object> setSocketOutput = new HashSet<Object>(1, 1); 
    private BlockingQueue<Set<Object>> bqSocketOutput; 

    ProcessThread pThread; 

    @Override 
    public void run() { 
     pThread = new ProcessThread(bqSocketOutput); 
     pThread.start(); 
     for(long i=0; i<= 30000; i++) { 
      System.out.println("SocketThread - Testing" + i); 
     } 
    } 

} 

public class ProcessThread extends Thread { 

    public ProcessThread(BlockingQueue<Set<Object>> bqTrace) { 
     System.out.println("ProcessThread - Constructor"); 
    } 

    @Override 
    public void run() { 
     System.out.println("ProcessThread - Exectution"); 
     while (true) { 

      /* 
      try { 
       TimeUnit.NANOSECONDS.sleep(1); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }*/ 
     } 
    } 
} 
+4

'while (true)'루프에서 실제로 무엇을하고 있습니까? 대답은 그것에 달려 있습니다. – ARRG

+3

ProcesThread에서 무한 루프를 실행 중입니다. 전체 핵심을 사용하는 것 이외에 무엇을 기대합니까? – Mat

+0

루프에서 실제로 아무 것도하지 않는다면 CPU가 그 상태를 매우 바쁘게 확인할 것입니다. 잠시 동안. 그 고리가 어울리는 것을 원한다면, 잠자는 동안 쉬어야합니다. – deraj

답변

1

당신은 스레드를 수면에 의해 "CPU 사용률을 줄일"수 있지만, 그것은 당신이 그 스레드에서 수행 모든 작업을 받고되지 않음을 의미 당신이있는 경우 (또는, 그것은 점점 스레드가 완전히 실행되도록하는 것보다 극적으로 느린 작업). 그것은 몇 마일마다 멈추고 엔진을 끄는 것으로 자동차의 연료 소비를 줄일 수 있다고 말하는 것과 같습니다.

일반적으로 while(true) 루프 인 스레드 동기화를 차단하는 일종의없이 실행 (A .Wait()처럼, 또는 상황에, 마틴 - 제임스 알 @로 BlockingQueue.take())는 코드 냄새와 리팩토링해야 코드를 나타냅니다.

+0

자동차 애호 사랑 :) – ARRG

1

작업자 스레드가 take()을 호출하여 차단 대기열에서 대기하는 경우 CPU 리소스를 소모해서는 안됩니다.

아무렇지도 않은 루프가있는 경우 (예제 코드에서 알 수 있듯이) 물론 리소스를 소비합니다. 루프 내부에서 리미터로 잠을 자고하면 아마도 최선의 방법은 아닙니다.

1

수행해야 할 작업이있는 한 CPU를 두 배로 늘리는 루프가 두 개 있습니다. 잠자기는 응용 프로그램의 속도를 늦추고 CPU 사용량을 줄이는 방법 중 하나이지만 원하는 결과는 거의 볼 수 없습니다.

수면을 주장하는 경우 수면 시간을 20 밀리 초 이상으로 늘려야합니다. 일괄 처리 후에도 수면을 들여다 볼 수 있습니다. 또한 SocketThread 인쇄 루프에서 비슷한 수면이 필요합니다.