package javacodebook.thread.multiusethread; /** * Bei diesem Beispiel wird nicht der WorkerThread direkt gestartet und * gestoppt, sondern die Klasse MultiuseThreadContainer. Diese übernimmt * das Starten und Stoppen des WorkerThreads. */ public class ContainerStarter extends Thread { public static void main(String []args) throws Exception { // Es wird ein neuer ThreadContainer für die mehrfache Benutzung // erzeugt. MultiuseThreadContainer container = new MultiuseThreadContainer(); // Der 'Thread' wird mehrfach gestartet und auch wieder gestoppt. for (int i=0; i<5; i++) { container.start(); sleep(1500); container.stop(); sleep(500); } } } --- Neue Klasse --- package javacodebook.thread.multiusethread; /** * Mithilfe dieser Klasse ist es möglich, das Mehrfache starten und stoppen * eines Threads zu simulieren. Intern wird bei jedem Aufruf der Methode * start() ein neuer Thread erzeugt und gestartet. */ public class MultiuseThreadContainer { WorkerThread worker; boolean isStarted = false; /** * Erzeugt einen neuen Thread und startet diesen. Wenn bereits ein Thread * läuft, dann wird natürlich kein neuer Thread erzeugt und gestartet. */ public void start() { if (isStarted) return; worker = new WorkerThread(); worker.start(); isStarted = true; } /** * Stoppt den laufenden Thread. Wenn kein Thread läuft, dann kann natürlich * auch kein Thread gestoppt werden. */ public void stop() { if (!isStarted) return; worker.stopExecution(); isStarted = false; } } --- Neue Klasse --- package javacodebook.thread.multiusethread; /** * Bei diesem Beispiel wird versucht, einen normalen Thread mehrfach zu starten * und zu stoppen. Der Versuch scheitert jedoch, da ein Thread nur ein einziges * mal gestartet werden kann. */ public class ThreadStarter extends Thread { public static void main(String []args) throws Exception { WorkerThread thread = new WorkerThread(); for (int i=0; i<5; i++) { thread.start(); sleep(1500); thread.stopExecution(); sleep(500); } } } --- Neue Klasse --- package javacodebook.thread.multiusethread; /** * Der Thread, der mehrfach gestartet und gestoppt werden soll. Was der Thread * letztendlich macht, ist für das Beispiel unerheblich. */ class WorkerThread extends Thread { boolean stop = false; public void run() { // Der Thread wurde gestartet und läuft solange, bis er von aussen // über die Methode stopEcexution gestoppt wird. Alle 100 ms gibt // der Thread ein Lebenszeichen von sich. System.out.println("Thread gestartet"); while (!stop) { System.out.print("."); try { sleep(100); } catch(Exception ignore) {} } System.out.println("\nThread gestoppt"); } /* * Methode, um den Thread jederzeit sauber stoppen zu können */ public void stopExecution() { stop = true; } }