Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法设置SwingWorker使用的后台线程的优先级?_Java_Multithreading_Swing_Swingworker_Thread Priority - Fatal编程技术网

Java 有没有办法设置SwingWorker使用的后台线程的优先级?

Java 有没有办法设置SwingWorker使用的后台线程的优先级?,java,multithreading,swing,swingworker,thread-priority,Java,Multithreading,Swing,Swingworker,Thread Priority,在Java中,有没有一种方法可以为调用SwingWorker对象的doInBackground()方法的线程设置优先级 在线程API中有一个setPriority()方法。SwingWorker.execute()方法计划SwingWorker在工作线程上执行。我希望能够访问该工作线程以设置其优先级 据我所知,这个工作线程来自一个默认的工作线程池。处理这个问题的唯一方法是使用我自己的执行器吗?我能想到的唯一方法是让execute方法使用thread.currentThread()获取当前线程。然

在Java中,有没有一种方法可以为调用
SwingWorker
对象的
doInBackground()
方法的线程设置优先级

在线程API中有一个
setPriority()
方法。
SwingWorker.execute()
方法计划SwingWorker在工作线程上执行。我希望能够访问该工作线程以设置其优先级


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

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

JDK7提示设计者不希望用户直接与后台线程交互或更改后台线程:

。。。为任何特定SwingWorker选择线程的确切策略未指定,不应依赖。

SwingWorker.getWorkersExecutorService()的实现似乎强化了这一理念,因为他们以一种不易改变的方式实现了它


SwingWorker是典型案例的样板解决方案,而您没有典型案例。我建议您编写代码来处理运行后台任务,而不是试图让SwingWorker做您想做的事情。这样,将来维护您的代码的人(甚至是您自己!)就不会对SwingWorker的行为不符合预期感到疑惑

由于SwingWorker是一个
可运行的
,因此您可以将其提交给任何
java.util.concurrent.ExecutorService

,除非您使用的是接近100%的所有CPU,否则设置优先级可能不会有任何区别。如果您正在使用所有的CPU,那么优先级只是JVM或操作系统可以忽略的一个提示。我想这不会解决你的问题。应用程序专门针对Windows,JVM是标准的Oracle JVM。从另一个堆栈溢出问题来看,它在这个场景中确实起到了一些作用:它改变了给操作系统的提示。当你不使用所有的cpu时,它是否会有任何不同,这是我的问题。好吧,如果你有空闲的cpu,那么不管优先级如何,每个可以运行的线程都会运行。只有当操作系统必须做出优先级重要的选择时,它才重要。@Peter,Windows使用进程基本优先级和线程优先级来考虑一些总体优先级。另一方面:增加优先级会使线程干扰GC线程,并且您总是希望GC线程先运行。我认为这种方法可以工作
Thread.currentThread()
应该在“doInBackground()”方法(工作线程)中执行。这似乎有效。我认为我可能需要在方法结束时将其切换回默认优先级,因为线程将返回到池中,并用于其他用途。就像Jason Braucht说的这可能是个糟糕的设计。