【问题标题】:Is there a way to set the priority of the background thread used by a SwingWorker?有没有办法设置 SwingWorker 使用的后台线程的优先级?
【发布时间】:2012-04-27 23:33:47
【问题描述】:

在 Java 中,有没有办法为将调用 doInBackground() 对象的 doInBackground() 方法的线程设置优先级?

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

据我了解,此工作线程来自默认工作线程池。解决这个问题的唯一方法是使用我自己的执行器吗?

【问题讨论】:

  • 除非您使用接近 100% 的所有 CPU,否则设置优先级可能没有任何区别。如果您正在使用所有 CPU,则优先级只是 JVM 或 OS 可以随意忽略的提示。恕我直言,它不会解决您的问题。
  • 该应用程序专门针对 Windows,JVM 是标准的 Oracle JVM。从这个其他堆栈溢出问题来看,它确实在这种情况下有所不同:stackoverflow.com/questions/297804/…
  • 它对提供给操作系统的提示有所不同。当您不使用所有 cpu 时,它是否有任何区别,这是我的问题。 AFAIK,如果你有空闲的 cpu,每个可以运行的线程都将运行,无论优先级如何。仅当操作系统必须做出优先级重要的选择时才重要。
  • @Peter,Windows 使用进程基优先级和线程优先级来考虑一些整体优先级。附带说明:增加 prir 会使线程干扰 GC 线程,并且您总是希望 GC 线程首先运行。

标签: java multithreading swing swingworker thread-priority


【解决方案1】:

由于 SwingWorker 是Runnable,您可以将其提交给任何java.util.concurrent.ExecutorService

【讨论】:

    【解决方案2】:

    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 的行为不如预期。

    【讨论】:

      【解决方案3】:

      我能想到的唯一方法是让执行方法使用Thread.currentThread() 获取当前线程。然后,您可以设置此线程的优先级(前提是允许调用者)。

      【讨论】:

      • 我认为这种方法可行。 Thread.currentThread() 应该在“doInBackground()”方法(工作线程)中执行。
      • 这似乎有效。我想我可能需要在方法结束时将其切换回默认优先级,因为线程将返回到池中并用于其他用途。就像 Jason Braucht 所说的那样,这可能是一个糟糕的设计。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      相关资源
      最近更新 更多