2014-01-17 81 views
2

我想创建一个ThreadPollExecutor来执行给定优先级的任务Process.setThreadPriority(int)ThreadPoolExecutor和Android的线程优先级

我应该怎么做?在发送给线程轮询的每个可运行的开始时,将调用添加到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(); 
     } 

    } 

} 

,这是什么问题,最好的解决办法:我使用自定义线程工厂这样也算?谢谢

回答

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

} 
+0

奥基,我不是很在多线程经验,需要确认,非常感谢你 – Addev

+0

你的工厂似乎比需要更复杂一点,但我会发布一个简化版本。 –

+0

查看编辑后。 –