我需要以低于应用程序中所有其他线程的优先级(MIN_PRIORITY
)运行由 ScheduledExecutorService
执行的所有计划任务/线程。我一直按照以下方式执行此操作,但这是完成此操作的正确方法吗?
ScheduledExecutorService schdExctr = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setPriority(Thread.MIN_PRIORITY);
return t;
}
});
编辑:
我认为更好的实现是这样的:
private ScheduledExecutorService schdExctr = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = Executors.defaultThreadFactory().newThread(r);
t.setPriority(Thread.MIN_PRIORITY);
return t;
}
});
最佳答案
是的,这是正确的方法,另外您可以查看 Executors.DefaultThreadFactory
类源代码以了解默认线程是如何命名的。
public Thread newThread(Runnable r) {
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.MIN_PRIORITY)
t.setPriority(Thread.MIN_PRIORITY);
return t;
}
其中 group
和 namePrefix
是:
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
namePrefix = "pool-" +
poolNumber.getAndIncrement() +
"-thread-";
和threadNumber
是:
private final AtomicInteger threadNumber = new AtomicInteger(1);.
在您的实现中,您将不需要 poolNumber
。
问题编辑后编辑: 解决方案是:
private ScheduledExecutorService schdExctr = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
private ThreadFactory defaultThreadFactory = Executors.defaultThreadFactory();
@Override
public Thread newThread(Runnable r) {
Thread t = defaultThreadFactory.newThread(r);
t.setPriority(Thread.MIN_PRIORITY);
return t;
}
});
关于java - ScheduledExecutorService 以低于应用程序中所有其他线程的优先级运行所有计划任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18936741/