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

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

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

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

3 ответа

Решение

Javadoc JDK7 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 ведет себя не так, как ожидалось.

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

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

Другие вопросы по тегам