Ответ 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