Java 通过ScheduledExecutorService以低于应用程序中其他所有线程的优先级运行所有计划任务

Java 通过ScheduledExecutorService以低于应用程序中其他所有线程的优先级运行所有计划任务,java,multithreading,Java,Multithreading,我需要以低于应用程序中其他所有线程的优先级(以minu优先级)运行由ScheduledExecutorService执行的所有计划任务/线程。我一直在用下面的方法做这件事,但这是实现这一目标的正确方法吗 ScheduledExecutorService schdExctr = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { @Override public Thread newThread(Run

我需要以低于应用程序中其他所有线程的优先级(以
minu优先级
)运行由
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;
    }
其中
名称前缀
为:

        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;
        }
    });

除了线程命名之外,还有什么需要在上面的覆盖中实现的吗?在默认实现中,线程组被设置为新线程,线程被设置为非守护线程。我正在更新答案。IMHO我认为包括所有这些的更好方法可能是,正如我在上述问题中的更新所建议的那样。您最好将
Executors.defaultThreadFactory()的值存储在匿名类的成员中,因为每次需要线程时调用都会创建一个线程工厂。因为我使用的是
newSingleThreadScheduledExecutor
,所以我认为只应该创建一个线程,缓存并永远使用?!没有??我在想两种不同的情况:1。线程死亡并重新启动,或者您可能希望将来在其他地方使用它,并且您可能希望它有一个良好的实现,但除此之外,这是一个简短而干净的解决方案。谢谢,请在您的答案中更新此内容,以便我可以接受它。