문제

몇 개의 스레드에서 실행되는 프로그램이 있습니다.메인 스레드는 다른 스레드와 객체를 공유하며 메인 스레드에서는 다음을 호출합니다.

synchronized(obj){
    do stuff
}

메인 스레드가 고갈되어 액세스할 수 없는 것 같습니다. obj.메인 스레드의 우선순위를 어떻게 높이나요? 아니면 기본적으로 다른 스레드보다 이미 높은가요?

도움이 되었습니까?

해결책

스레드 클래스에 setPriority () 메소드가 있습니다.

확인하다 이 Javadoc.

스레드 우선 순위를 최대로 설정 :

public static void main(String args[]) {
    Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    // Your main code.
}

다른 팁

기사 시리즈 여기 다양한 플랫폼에서 스레드 우선순위 관리에 일부 복잡성이 있음을 나타냅니다.

귀하의 근본적인 문제는 단순히 작업자 스레드가 CPU를 많이 사용하므로 자연스럽게 프로세서를 "사용하지 않는" 지점에 거의 도달하지 않는다는 것입니다(예를 들어 일부 IO를 수행하거나 절전 모드를 통해). 그렇다면 그런 경우입니다. 해당 작업자에 Yield()에 대한 일부 호출을 포함시켜 다른 스레드에 더 많은 기회를 제공할 수 있습니다.

setPriority () 메소드를 사용할 수 있습니다. 예를 들어:

new MyThread("Foo").start(); 
Thread bar = new MyThread("Bar"); 
bar.setPriority( Thread.NORM_PRIORITY + 1 ); 
bar.start();

이것은 바에 새로운 우선 순위를 제공하여 신속하게 FOO를 인수해야합니다.

편집하다:

의견에 답하기 위해 Max Priortiy를 사용하여 다음을 설정할 수 있습니다.

bar.setPriority( Thread.MAX_PRIORITY );

기본 스레드의 우선 순위를 높이고 있습니다MacArse 아마도 효과가있을 것입니다. 그러나 플랫폼의 선제 스레드 스케줄러에 의존하여 제대로 작동합니다. 대신 전화해야합니다 Thread.yield() 작업자 스레드의 정적 메소드가 실행중인 중요한 코드 섹션으로 완료 될 때 스레드. 이것은 다른 수준의 스레드 우선 순위를 사용하는 경우에도 들어가는 좋은 습관입니다.

다른 사람들이 이미 대답했듯이, 당신은 실제로 다음과 같이 스레드에 우선 순위를 설정할 수 있습니다.

Thread.currentThread().setPriority(priority);

그러나 예를 들어, 스레드 우선 순위는 순서 스레드가 동기화 된 객체에 액세스 할 수있는 일이 없다는 것을 알고 있습니다. Java는 다른 기준을 사용하여 액세스를 제공합니다. 예를 들어 참조하십시오 이것.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top