Разница между анкерами и пулом потоков исполнителей

Я читал о циклах, а также в Пуле потоков исполнителя, и они, кажется, делают то же самое... или я что-то упустил?

Ответ 1

A Looper управляет задачами, которые будет выполняться Thread. Он помещает их в очередь, а затем Thread берет следующую задачу в строке. Looper привязан к конкретной теме.

An Executor инкапсулирует управление и распределение задач для разных потоков. Если у вас есть фиксированный размер threadpool 1, я предполагаю, что он будет похож по дизайну на Looper, потому что он просто остановит работу для этого одного потока. Если у вас есть threadpool с размером > 1, то он будет управлять заданием для следующего потока, доступного для выполнения работы, или, другими словами, будет распределять задачи среди всех потоков.

edit: Рекомендуемое чтение: http://developer.android.com/reference/java/util/concurrent/package-summary.html

Исполнители более гибкие. Для Android единственный раз, когда я действительно использую Looper, я пытаюсь заставить обработчика общаться с основным потоком из фонового потока (который может быть даже в ExecutorService). Например:

Handler mainThreadHandler = new Handler(Looper.getMainLooper());
mainThreadHandler.post(new Runnable...); //runs on main thread

Ответ 2

Позвольте мне добавить, что Android-циклытель может использоваться нативным кодом. Система Android Looper состоит из класса Looper, класса Handler, класса MesseageQueue. Один циклытель ограничен одной нитью. Начиная с Andorid 4.0, MessageQueue реализуется как Java-кодом, так и кодом C, которые связаны между собой. Вы можете отправить сообщение тому же MessageQueue с помощью собственного кода или кода Java.

Итак, разница в следующем:

  1. Looper прост с одним потоком, однако ExecutorThreadPool сложен и гибок с одним или несколькими потоками.

  2. Looper может быть удобно использован нативным кодом.

Кроме того, Looper и Handler обычно используются в коде Android. Некоторые разработчики андроидов более просты в использовании Handler, чем ExecutorThreadPool.