2012-05-08 4 views
6

오랜 시간 계산을 수행하는 프로그램이 있으므로 성능을 높이고 싶습니다. 그래서 지금 당장 3 개의 스레드를 실행하려고 시도했지만 java.exe은 여전히 ​​CPU 사용량의 25 %를 차지하므로() .setPriority(Thread.MAX_PRIORITY);을 사용하려고 시도하고 실시간 (0120)에서 java.exe의 우선 순위를 설정하더라도 남아 있습니다. . 나는 RealtimeThread을 사용하려고했지만 더 느리게 작동하는 것처럼 보입니다. 각 스레드가 하나의 프로세서에 할당되고 총 CPU 사용량이 75 %까지 증가하면 완벽 할 수 있지만이를 수행하는 방법을 모르겠습니다. 이것이 바로 내 코드의 모습입니다.내 스레드 프로그램이 하나의 CPU 만 사용하는 이유는 무엇입니까?

Thread g1 = new MyThread(i,j); 
g1.setPriority(Thread.MAX_PRIORITY); 
g1.run(); 
Thread g2 = new MyThread(j,i); 
g2.setPriority(Thread.MAX_PRIORITY); 
g2.run(); 
Thread g3 = new MyThread(i,j); 
g3.setPriority(Thread.MAX_PRIORITY); 
g3.run(); 
if (g1.isAlive()) { 
     g1.join(); 
} 
if (g2.isAlive()) { 
     g2.join(); 
} 
if (g3.isAlive()) { 
     g3.join(); 
} 
+2

다른 사람들이 지적했듯이'.start()'를 사용하십시오. 그러면 아마도 우선 순위를 가지고 놀지 않고 스케쥴러에 스케쥴을 남기기를 원할 것입니다. 쓰레드 스케줄링에 대해 많은 것을 알지 못한다면, 스케쥴러의 일을하는 것보다 더 나은 일은 거의 없다. –

+0

[java thread - run() 및 start() 메서드] 가능한 복제본 (http://stackoverflow.com/questions/3027495/java-thread-run-and-start-methods) –

답변

23

실제로 스레드를 사용하고 있지 않습니다.

이 아닌 .start()으로 전화해야합니다.

11

이것은 실제로 CPU와 관련이 없습니다. 실제로 3 개의 스레드를 시작하지 않고 메인 스레드에서 모든 것을 실행하고 있습니다. 스레드를 시작하려면 run()이 아닌 start() 메서드를 호출하십시오.

6

먼저 다른 제안에서와 같이, 실제로는 여러 스레드를 사용하지 않습니다. 이것은 호출 스레드에서 작업을 끝내는 run() 메서드를 호출하기 때문입니다.

이제 남은 질문에 대답하기 위해 멀티 스레드 프로세스의 효율성을 극대화하는 방법을 설명합니다. 이것은 간단한 질문은 아니지만 기본 사항을 알려 드리겠습니다. (다른 사람들은 자유롭게 체임 할 수 있습니다.)

프로세스의 효율성을 극대화하는 가장 좋은 방법은 모든 스레드가 동일한 양의 작업을 수행하도록하고 차단을 막으려 고 시도하는 것입니다. 즉, 응용 프로그램을 효율적으로 실행하기 위해 작업 부하를 "균형 잡는"것이 귀하의 임무입니다.

일반적으로 특정 CPU 코어에서 실행되는 스레드는 할당 할 수 없습니다. 이는 일반적으로 OS와 CPU 자체의 작업입니다. OS는 사용자가 제공하는 우선 순위를 사용하여 프로세스를 예약 한 다음 CPU가 명령 수준에서 자체 예약을 수행 할 수 있습니다. 우선 순위를 설정하는 것 외에도 나머지 일정은 완전히 통제 할 수 없습니다.

편집 : 세미콜론에 중독되어 있습니다.

관련 문제