3

アプリケーション内の他のすべてのスレッドを停止するよりもScheduledExecutorService低い優先度 (で) で実行されるすべてのスケジュールされたタスク/スレッドを実行する必要があります。MIN_PRIORITY私はこれを次の方法で行ってきましたが、これはこれを達成する正しい方法ですか?

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

1 に答える 1

3

はい、それが正しい方法です。さらに、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;
        }
    });
于 2013-09-21T19:36:52.033 に答える