我有一个ThreadPoolExecutor
和一个Runnable
,称为this.runnable
。我这样运行:
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(1);
executor.execute(this.runnable);
通常,this.runnable
将几乎立即被调用(100-200us之后)。但是有时,如果CPU繁忙,则可能需要一段时间才能运行。
有没有一种方法可以“强制”立即执行,或者建议JVM / ThreadPoolExecutor优先执行该线程?我需要将其保留为单独的线程,但同时,我需要它开始紧急运行。
您可以尝试增加创建的线程的优先级:
ExecutorService executorService = Executors.newFixedThreadPool(1, runnable -> {
Thread thread = new Thread(runnable);
thread.setPriority(Thread.MAX_PRIORITY);
return thread;
});
有没有一种方法可以“强制”立即执行,或者建议JVM / ThreadPoolExecutor优先执行该线程?
没有另外,一旦线程启动,就无法控制线程继续运行。您可以设置线程的单个优先级,但这仅在JVM决定是运行线程还是其他优先级可能较低的线程时才有用–它不允许您在任何时候或任何时候使线程运行。
特别是对于ThreadPoolExecutor
,当您在execute()
的实例上调用ThreadPoolExecutor
时,Javadoc说:“在将来的某个时间执行给定的任务。”没有提及如何影响或控制when线程将启动。
我需要将其保留为单独的线程,但同时,我需要它来开始紧急运行。
也许您可以创建一个带有一个(或多个)线程准备运行的线程池,并使用Java内置的并发类(例如Semaphore)作为开始执行的方式。