2012-04-16 46 views
5

在Java中,是否有一种方法可以设置将调用SwingWorker对象的doInBackground()方法的线程的优先级?有没有办法设置SwingWorker使用的后台线程的优先级?

在Thread API中有一个setPriority()方法。方法SwingWorker.execute()安排在工作线程上执行回转工。我想访问该工作线程来设置它的优先级。

从我的理解,这个工作线程来自一个默认的工作线程池。处理这个问题的唯一方法是使用我自己的执行者吗?

+4

。如果您使用的是所有CPU,则优先级只是JVM或OS可以忽略的提示。恕我直言,它不会解决你的问题。 – 2012-04-16 16:08:34

+0

该应用程序专门针对Windows,JVM是标准的Oracle JVM。从这个其他堆栈溢出的问题,它确实在这种情况下有所作为: http://stackoverflow.com/questions/297804/thread-api-priority-translation-to-os-thread-priority – Clinton 2012-04-17 22:08:40

+0

它有所不同提示给操作系统。当你不使用所有的CPU时,它是否会有所不同,这是我的问题。 AFAIK,如果你有空闲的CPU,每个可以运行的线程都会运行,而不管优先级如何。只有当操作系统必须做出优先重要的选择时,它才是重要的。 – 2012-04-18 05:27:32

回答

7

的JDK7 SwingWorker javadoc暗示,设计者并没有打算让用户直接交互或更改后台线程:

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

SwingWorker.getWorkersExecutorService(的实现)似乎强化了这种想法,因为他们已经以一种不容易改变的方式实施它。

SwingWorker是典型案例的样板解决方案,您没有典型案例。我建议你编写代码来处理运行后台任务,而不是试图破解SwingWorker来做你想做的事情。这样,谁就可以在未来维护你的代码(甚至可能是你自己!),不会奇怪为什么SwingWorker没有按预期那样工作。

5

我认为这样做的唯一方法是让执行方法使用Thread.currentThread()来抓取当前线程。然后,您可以设置此线程的优先级(只要允许调用者)。

+2

我认为这种方法可以工作。应该在“doInBackground()”方法(工作线程)中执行'Thread.currentThread()'。 – 2012-04-16 20:57:07

+1

这似乎工作。我想我可能需要在方法结束时将它切换回默认的优先级,因为线程将返回到一个池中,并将用于其他内容。就像Jason Braucht说的那样,这可能是一个糟糕的设计。 – Clinton 2012-04-17 21:30:47

2

由于SwingWorker类是Runnable,你可以除非你使用接近所有CPU的100%,设置优先级可能没有任何区别,提交任何java.util.concurrent.ExecutorService

+2

这也是一个未来。 – 2012-04-16 21:12:23

相关问题