2009-10-24 18 views
23

Mam program, który działa w kilku wątków. Główny wątek dzieli obiekt z innych wątków, a zasadniczo mam wezwanie do:Ustawianie priorytetu wątków Java

synchronized(obj){ 
    do stuff 
} 

Mam podejrzenie, że główny wątek jest zagłodzony i nie jest uzyskanie dostępu do obj. Jak podnieść priorytet wątku głównego lub czy jest on już domyślnie wyższy niż inne wątki?

+1

Macarse już poradził sobie z tym, jak zmienić priorytet, ale być może mógłbyś wkleić trochę więcej kodu. Może być coś złego, lub sposób na to, aby inne wątki spędzały mniej czasu na synchronizacji. –

+0

jak ustawić priorytet wśród 20 wątków, ponieważ priorytet wątku wynosi od 1 do 10, więc oznacza to, że tylko 9 wątków może mieć priorytet ... ?? – anshulkatta

Odpowiedz

35

Masz metodę setPriority() w klasie wątków.

Sprawdź this javadoc.

Ustawianie priorytetu wątku maksymalna:

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

więc mówisz - w każdym wątku, który tworzę, ustaw set Priority (minimum). Czy istnieje sposób, aby ustawić priorytet wątku głównego na maksimum? i czy to robi różnicę? – Guy

+0

Edytowałem swój wpis, jak ustawić maksymalny priorytet dla głównego wątku. Nie sądzę, że to coś zmieni. Naprawdę nie wiem, co robisz, ale wątki Java nie powinny wymagać od ciebie zmiany priorytetów, aby uniknąć głodu. – Macarse

+3

jak ustawić priorytet wśród 20 wątków, ponieważ priorytet wątku wynosi od 1 do 10, więc oznacza to, że tylko 9 wątków może mieć priorytet ... ?? – anshulkatta

9

Seria artykułów here wskazuje na pewne zawiłości w zarządzaniu priorytetami wątków na różnych platformach.

Zastanawiam się, czy twoim podstawowym problemem jest to, że twoje wątki pracownicze są bardzo obciążające procesor, a zatem rzadko osiągają punkt, w którym w naturalny sposób "wypuszczą" procesor (na przykład wykonując niektóre operacje wejścia/wyjścia lub śpiąc). jest tak, że możesz włączyć do tych pracowników kilka wywołań funkcji yield(), co daje więcej wątków.

5

można użyć metody setpriority(). Na przykład:

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

Daje bar nowy priorytet, który powinien szybko przejąć Foo

Edit:

Aby odpowiedzieć na komentarz, można ustawić max priortiy używając:

bar.setPriority(Thread.MAX_PRIORITY); 
+0

ale ustawiasz MAX_PRIORITY na wątek, a nie główny wątek. – Guy

+0

wystarczy ustawić wątek, który chcesz mi min. MIN_PRIORITY itp ... – northpole

3

Zwiększenie priorytetu głównego wątku w sposób, w jaki Macarse mówi, że prawdopodobnie zadziała. Jednak w celu poprawnego działania powinieneś polegać na zapobiegawczym programie planującym wątki platformy. Powinieneś zamiast tego wywołać metodę statyczną Thread.yield() w wątkach roboczych po wykonaniu ważnych sekcji kodu, które są uruchomione. Jest to dobry nawyk, nawet gdy używasz różnych poziomów priorytetu wątku.

0

Jak inni już odpowiedział, można rzeczywiście ustawić priorytet wątku w następujący sposób:

Thread.currentThread().setPriority(priority); 

Ale należy pamiętać, w przykładzie, że priorytetem wątek ma nic wspólnego, w jakiej kolejności wątków uzyskać dostęp do synchronizowanego obiektu. Java korzysta z innych kryteriów, aby dać dostęp. Zobacz na przykład this.

Powiązane problemy