如何使ThreadPoolExecutor在Java中立即执行

问题描述 投票:1回答:2

我有一个ThreadPoolExecutor和一个Runnable,称为this.runnable。我这样运行:

ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(1);
executor.execute(this.runnable);

通常,this.runnable将几乎立即被调用(100-200us之后)。但是有时,如果CPU繁忙,则可能需要一段时间才能运行。

有没有一种方法可以“强制”立即执行,或者建议JVM / ThreadPoolExecutor优先执行该线程?我需要将其保留为单独的线程,但同时,我需要它开始紧急运行。

java multithreading threadpool runnable threadpoolexecutor
2个回答
0
投票

您可以尝试增加创建的线程的优先级:

ExecutorService executorService = Executors.newFixedThreadPool(1, runnable -> {
    Thread thread = new Thread(runnable);
    thread.setPriority(Thread.MAX_PRIORITY);
    return thread;
});

0
投票

有没有一种方法可以“强制”立即执行,或者建议JVM / ThreadPoolExecutor优先执行该线程?

没有另外,一旦线程启动,就无法控制线程继续运行。您可以设置线程的单个优先级,但这仅在JVM决定是运行线程还是其他优先级可能较低的线程时才有用–它不允许您在任何时候或任何时候使线程运行。

特别是对于ThreadPoolExecutor,当您在execute()的实例上调用ThreadPoolExecutor时,Javadoc说:“在将来的某个时间执行给定的任务。”没有提及如何影响或控制when线程将启动。

我需要将其保留为单独的线程,但同时,我需要它来开始紧急运行。

也许您可以创建一个带有一个(或多个)线程准备运行的线程池,并使用Java内置的并发类(例如Semaphore)作为开始执行的方式。

© www.soinside.com 2019 - 2024. All rights reserved.