Was sind die Vorteile / Gründe für die Verwendung eines Handlers und nicht eines Threads?
Mit einem Handler können Sie Nachrichten und Runnable
Objekte senden und verarbeiten, die einem Thread zugeordnet sind MessageQueue
. Jede Handler
Instanz ist einem einzelnen Thread und der Nachrichtenwarteschlange dieses Threads zugeordnet.
Wenn Sie ein neues erstellen Handler
, wird es an die Thread- / Nachrichtenwarteschlange des Threads gebunden, der es erstellt. Ab diesem Zeitpunkt werden Nachrichten und ausführbare Dateien an diese Nachrichtenwarteschlange gesendet und ausgeführt, sobald sie aus der Nachrichtenwarteschlange kommen .
Es gibt zwei Hauptverwendungen für einen Handler:
- Planen von Nachrichten und ausführbaren Dateien , die zu einem späteren Zeitpunkt ausgeführt werden sollen
- So stellen Sie eine Aktion in die Warteschlange , die für einen anderen Thread als Ihren eigenen ausgeführt werden soll.
Wenn Sie Java-Threads verwenden, müssen Sie einige Dinge selbst erledigen - Synchronisieren mit dem Haupt-Thread, Abbrechen eines Threads usw.
Dieser einzelne Thread erstellt keinen Thread-Pool, es sei denn, Sie verwenden ThreadPoolExecutor
oder ExecutorService
API.
(Diese Frage wurde Ihren Kommentaren zur Blackbelt-Antwort entnommen.)
Warum nicht einen Executor verwenden? und selbst wenn ich dafür einen Handler verwenden wollte, wie?
Referenz: Artikel zur Thread-Leistung
Es gibt bestimmte Arten von Arbeiten, die auf hochparallele, verteilte Aufgaben reduziert werden können. Mit der schieren Menge der Arbeitspakete dies schafft, AsyncTask
und HandlerThread
nicht geeignet sind Klassen. Die Single-Threaded-Natur von AsyncTask
würde die gesamte Threadpool-Arbeit in ein lineares System verwandeln. Die Verwendung der HandlerThread
Klasse würde andererseits erfordern, dass der Programmierer den Lastausgleich zwischen einer Gruppe von Threads manuell verwaltet.
ThreadPoolExecutor ist eine Hilfsklasse , um diesen Prozess zu vereinfachen. Diese Klasse verwaltet die Erstellung einer Gruppe von Threads, legt deren Prioritäten fest und verwaltet, wie die Arbeit auf diese Threads verteilt wird. Wenn die Arbeitslast zunimmt oder abnimmt, dreht sich die Klasse oder zerstört mehr Threads, um sich an die Arbeitslast anzupassen.
BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(), // Initial pool size
Runtime.getRuntime().availableProcessors(), // Max pool size
1, // KEEP_ALIVE_TIME
TimeUnit.SECONDS, // KEEP_ALIVE_TIME_UNIT
workQueue);
Weitere Informationen finden Sie in diesem Entwicklerhandbuch zu create-threadpool .
In diesem Beitrag Handler
erfahren Sie, wie Sie mehrere ausführbare Instanzen ausführen können. In diesem Fall werden alle Runnable
Aufgaben in einem einzigen Thread ausgeführt.
Android: Toast in einem Thread