2014-01-28 3 views
0

У меня есть большой проект Android с 50 различными экземплярами кода newSingleThreadExecutor(), которые запускаются различными непредсказуемыми событиями, включая нажатия кнопок пользовательского интерфейса. Немного исследовав, я думаю, что для каждого из 50 отдельных экземпляров кода создается один поток и будет поддерживать последовательный порядок выполнения вызовов исполнителю.Определение количества потоков, созданных Executors.newSingleThreadExecutor(). Execute?

Сколько потоков создано и есть ли проблема в поддержании последовательного выполнения в порядке вызовов исполнителю?

Примечание: код не используется, поэтому я смущен порядком исполнения и количеством созданных потоков. Например, что произойдет, если пользователь нажимает кнопку пользовательского интерфейса в сто раз очень быстро? Смогу ли я получить сто потоков, заканчивающихся в разное время, исходя из того, когда закончится фьючерс базы данных?

Ниже приведен порядок форматирования кода во всех 50 экземплярах.

Executors.newSingleThreadExecutor().execute(new Runnable() { 
    @Override 
     public void run() 
     { 
      // Executes multiple database calls using futures and 
      // Uses get() which waits if necessary for the computation to complete, 
      // and then retrieves its result. 
     } 
    }); 
+1

Принято, лучше поздно, чем никогда. – DataBits

ответ

1

Сколько нитей создается и существует проблема в обеспечении последовательного выполнения в порядке обращений к исполнителю?

Я не уверен, что я понимаю, спрашиваете ли вы о потоках пула или нити, раздвоенных каждый раз через цикл.

Так что если вы создаете новыйExecutorService каждый из 50 раз, то вы не можете определить, сколько потоков фактически создано. Если все 49 предыдущих заданий все еще запущены, то 50-е будет создавать другой поток. Если каждое из заданий заканчивается до следующего выполнения, будет создан только один поток. Это не учитывает количество фьючерсов и других вещей вниз по каждому потоку. Если это уже фоновый поток, вам действительно нужно несколько фьючерсов и т. Д.?

Без каких-либо подробностей, мне кажется, что здесь нужно использовать ExecutorService для всех 50 заданий. Вы можете определить, хотите ли вы фиксированное количество потоков или сделать его динамическим.

Я думаю, что для каждого из 50 отдельных экземпляров кода создается один поток, который будет поддерживать последовательный порядок выполнения вызовов исполнителю.

Там будет нет «Последовательный порядок», потому что вы создаете новый ИСПОЛНИТЕЛЬ сервис каждый раз. Если вы использовали один, тогда единственный способ гарантировать последовательный порядок выполнения - иметь только один поток в пуле.

Например, что происходит, если пользователь нажимает кнопку пользовательского интерфейса сто раз очень быстро? Смогу ли я получить сто потоков, заканчивающихся в разное время, исходя из того, когда закончится фьючерс базы данных?

Да, вы получите 100 различных потоков. Если вы хотите снова контролировать максимальное количество потоков forked, используйте один пул потоков для всех задач.

Btw, вы должны всегда выключение служба исполнителем после отправки последнего задания:

ExecutorService threadPool = Executors.newSingleThreadExecutor(); 
threadPool.execute(new Runnable() { ... }); 
// this must be done to properly quit the threads 
threadPool.shutdown(); 
+0

+1 для указания выключения. Хорошо, я думаю, вы поняли, что я пытался подтвердить. В принципе, мне нужно переработать код для использования одного ExecutorService. Благодарю. – DataBits

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