Есть ли способ установить приоритет фонового потока, используемого SwingWorker?

Есть ли в Java способ установить приоритет для потока, который будет вызывать метод doInBackground() объекта SwingWorker?

В Thread API есть метод setPriority(). Метод SwingWorker.execute() планирует выполнение Swingworker в рабочем потоке. Я хотел бы иметь доступ к этому рабочему потоку, чтобы установить его приоритет.

Насколько я понимаю, этот рабочий поток исходит из пула рабочих потоков по умолчанию. Будет ли единственный способ справиться с этим - использовать моего собственного исполнителя?


person Clinton    schedule 16.04.2012    source источник
comment
Если вы не используете почти 100% всех своих ЦП, установка приоритета может не иметь никакого значения. Если вы используете весь свой ЦП, приоритет — это просто подсказка, которую JVM или ОС могут игнорировать. ИМХО, это не решит вашу проблему.   -  person Peter Lawrey    schedule 16.04.2012
comment
Приложение специально предназначено для Windows, а JVM является стандартной JVM Oracle. Из этого другого вопроса о переполнении стека в этом сценарии есть некоторое различие: stackoverflow.com/questions/297804/   -  person Clinton    schedule 18.04.2012
comment
Это имеет значение для подсказки, данной ОС. У меня есть вопрос, имеет ли вообще какое-либо значение, когда вы не используете весь процессор. Насколько я знаю, если у вас есть запасной процессор, каждый поток, который может работать, будет работать независимо от приоритета. Это имеет значение только тогда, когда ОС должна сделать выбор, который имеет значение приоритета.   -  person Peter Lawrey    schedule 18.04.2012
comment
@Peter, Windows использует базовый приоритет процесса и приоритет потока, чтобы учесть некоторые общие приоритеты. На заметку: увеличение prir может привести к тому, что поток будет мешать потокам GC, и вы всегда хотите, чтобы потоки GC запускались первыми.   -  person bestsss    schedule 18.05.2012


Ответы (3)


JDK7 Javadoc SwingWorker намекает на то, что разработчики не предполагали, что пользователи напрямую взаимодействовать с фоновыми потоками или изменять их:

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

Реализация SwingWorker.getWorkersExecutorService(), похоже, подкрепляет эту идею, поскольку они реализовали ее таким образом, что ее нелегко изменить.

SwingWorker — это шаблонное решение для типичного случая, а у вас нет типичного случая. Я бы посоветовал вам написать код для обработки фоновых задач вместо того, чтобы пытаться взломать SwingWorker, чтобы он делал то, что вы хотите. Таким образом, любой, кто будет поддерживать ваш код в будущем (возможно, даже вы сами!), не будет задаваться вопросом, почему SwingWorker ведет себя не так, как ожидалось.

person Jason Braucht    schedule 16.04.2012

Единственный способ, которым я могу это сделать, - это заставить метод execute захватить текущий поток, используя Thread.currentThread(). Затем вы можете установить приоритет этого потока (при условии, что вызывающему абоненту разрешено).

person Jim    schedule 16.04.2012
comment
Я думаю, что этот метод мог бы работать. Thread.currentThread() должен выполняться в методе doInBackground() (рабочий поток). - person Vadim Ponomarev; 17.04.2012
comment
Это, казалось, сработало. Я думаю, что мне, возможно, придется переключить его обратно на приоритет по умолчанию в конце метода, поскольку поток будет возвращен в пул и будет использоваться для чего-то другого. Как сказал Джейсон Браухт, это может быть плохой дизайн. - person Clinton; 18.04.2012

Поскольку SwingWorker является Runnable, вы можете отправить его в любой java.util.concurrent.ExecutorService

person keuleJ    schedule 16.04.2012