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

标签 java multithreading

我需要以低于应用程序中所有其他线程的优先级(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;
    }

其中 groupnamePrefix 是:

        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/

相关文章:

c++ - Linux pthreads 上的 gcc 4.7 - 使用 __thread 的重要 thread_local 解决方法(无提升)

java - 输入按钮时将键盘隐藏在 fragment 中

java - 如何在运行时创建 JPA 持久性单元

java - 鼓励Admob点击违反TOS?

java - Eclipse 上的 Groovy 错误

.net - 线程加载(等待)屏幕

c# - 如何等待方法中创建的所有线程

multithreading - 仅按需从 TThread 动态初始化和调用 LoadLibrary 一次

c# - 为什么值变量不改变?

java - 是否可以从 Android 中的远程数据库填充 HTML 表?