2014-01-17 77 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

查看編輯後。 –