有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java线程池执行器和Android的线程优先级

我想制作一个ThreadPollExecutor,它执行具有给定优先级的任务Process.setThreadPriority(int)

我该怎么做?是否在发送到线程轮询的每个runnable的开始处添加对setThreadPriority的调用?我还考虑过使用如下自定义线程工厂:

private final static class ProcessPriorityThreadFactory implements ThreadFactory {

    private final int threadPriority;

    public ProcessPriorityThreadFactory(int threadPriority) {
        super();
        this.threadPriority = threadPriority;
    }

    @Override
    public Thread newThread(Runnable r) {
        return new Thread(new PriorityChangeWrapper(r, threadPriority));
    }

    private final static class PriorityChangeWrapper implements Runnable {
        private final Runnable originalRunnable;
        private final int threadPriority;

        public PriorityChangeWrapper(Runnable originalRunnable, int threadPriority) {
            super();
            this.originalRunnable = originalRunnable;
            this.threadPriority = threadPriority;
        }

        @Override
        public void run() {
            Process.setThreadPriority(threadPriority);
            originalRunnable.run();
        }

    }

}

这个问题的最佳解决方案是什么?谢谢


共 (1) 个答案

  1. # 1 楼答案

    您问题中给出的定制工厂是正确的方法。工厂模式的使用正是出于这个原因,因为它使您能够完全控制由ExecutorService创建的所有线程。(例如,您还可以更改线程名称等)

    您的工厂实施比需要的复杂得多,但您只需要:

    private final static class ProcessPriorityThreadFactory implements ThreadFactory {
    
        private final int threadPriority;
    
        public ProcessPriorityThreadFactory(int threadPriority) {
            this.threadPriority = threadPriority;
        }
    
        @Override
        public Thread newThread(Runnable r) {
            Thread thread = new Thread(r);
            thread.setPriority(threadPriority);
            return thread;
        }
    
    }