2014-01-17 2 views
2

Я хотел бы создать ThreadPollExecutor, который выполняет задачи с заданным приоритетом Process.setThreadPriority(int).ThreadPoolExecutor и приоритет потока Android

Как мне это сделать? Добавление вызова setThreadPriority в начале каждой runnable, отправленной в опрос нитей? Я также рассмотрел использование фабрики пользовательских нитей вроде этого:

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

См. Отредактированный пост. –

Смежные вопросы