ThreadPoolExecutor和Android的线程优先级

Add*_*dev 2 java parallel-processing multithreading 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();
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*m B 6

您问题中给出的自定义工厂是正确的方法.出于这个原因使用工厂模式,因为它可以完全控制由创建的所有线程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;
    }

}
Run Code Online (Sandbox Code Playgroud)

  • @TimB Here Prority应该从andorid.os.Process类还是Java Thread类设置?由于两者都具有相反的优先顺序. (2认同)