2012-04-16 5 views
5

W języku Java istnieje sposób ustalania priorytetu dla wątku, który będzie wywoływał metodę doInBackground() obiektu obiektu SwingWorker?Czy istnieje sposób ustawienia priorytetu wątku tła używanego przez SwingWorker?

W interfejsie API wątków dostępna jest metoda setPriority(). Metoda SwingWorker.execute() planuje swingworker do wykonania w wątku roboczym. Chciałbym mieć dostęp do tego wątku roboczego, aby ustawić jego priorytet.

Z mojego rozumienia ten wątek roboczy pochodzi z domyślnej puli wątków roboczych. Czy jedynym sposobem radzenia sobie z tym jest użycie mojego własnego executora?

+4

ile używasz blisko 100% wszystkich swoich procesorów, ustawienie priorytetu może nie robi żadnej różnicy. Jeśli używasz całego procesora, priorytet jest tylko wskazówką, którą JVM lub system operacyjny może zignorować. IMHO To nie rozwiąże twojego problemu. –

+0

Aplikacja jest specjalnie przeznaczona dla systemu Windows, a JVM jest standardową maszyną JVM Oracle. Z tego innego pytania dotyczącego przepełnienia stosu robi się pewną różnicę w tym scenariuszu: http://stackoverflow.com/questions/297804/thread-api-priority-translation-to-os-thread-priority – Clinton

+0

To robi różnicę podpowiedź dla systemu operacyjnego. Niezależnie od tego, czy w ogóle nie ma znaczenia, czy nie używasz całego procesora, jest to pytanie, które mam. AFAIK, jeśli masz zapasowego procesora, każdy wątek, który może działać, będzie działał niezależnie od priorytetu. Ma to znaczenie tylko wtedy, gdy OS musi dokonać wyboru, który ma znaczenie priorytetowe. –

Odpowiedz

7

W JDK7 SwingWorker javadoc wskazówki, że projektanci nie zamierzają użytkownikom bezpośrednio oddziaływać z lub zmieniać wątki tła:

... the exact strategy of choosing a thread for any particular SwingWorker is unspecified and should not be relied on.

Realizacja SwingWorker.getWorkersExecutorService() zdaje się potwierdzać tę ideę jak oni Zaimplementowałem to w sposób, który nie jest łatwo zmienić.

SwingWorker to rozwiązanie standardowe dla typowego przypadku i nie ma typowego przypadku. Proponuję napisać kod, aby poradził sobie z uruchamianiem zadań w tle, zamiast próbować hackować SwingWorker, aby zrobił to, co chcesz. W ten sposób ktokolwiek zachowa swój kod w przyszłości (może nawet sam!), Nie będzie się zastanawiał, dlaczego SwingWorker nie zachowuje się zgodnie z oczekiwaniami.

5

Jedyny sposób, w jaki mogę to zrobić, to wykonanie metody execute z bieżącym wątkiem przy użyciu Thread.currentThread(). Następnie możesz ustawić priorytet tego wątku (pod warunkiem, że dzwoniący ma pozwolenie).

+2

Myślę, że ta metoda może działać. 'Thread.currentThread()' powinno być wykonane w metodzie "doInBackground()" (wątek roboczy). –

+1

To wydawało się działać. Myślę, że być może będę musiał przełączyć go z powrotem na domyślny priorytet na końcu metody, ponieważ wątek zostanie zwrócony do puli i będzie używany do czegoś innego. Podobnie jak Jason Braucht powiedział, że to może być zły projekt. – Clinton

2

Jako SwingWorker jest Runnable, można go przesłać do dowolnego java.util.concurrent.ExecutorService

+2

To także przyszłość. –