From 264552c8b71bc82502ebd1f6fe137e1eb0a4c6b9 Mon Sep 17 00:00:00 2001 From: "J. Neugebauer" Date: Wed, 6 Jul 2022 20:33:10 +0200 Subject: [PATCH] Neue Klasse TaskRunner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TaskRunner ist eine statische Klasse, die einen ThreadPool verwaltet und es anderen KLassen ermöglicht, Parallele Prozesse auszuführen. Die ZM ist grundsätzlich erstmal nicht auf Parallelität ausgelegt, da alle im „GameLoop“ (Zeichenmaschine$Zeichenthread) pro Frame synchron läuft. Einige Aufgaben erfordern aber eigene Therad (z.B. das Abspielen von Musikdateien oder zukünftige Animationen). Der TaskRunner ist eine erste Verison einer Klasse, die zukünftig in der ZM an Bedeutung gewinnen könnte, wenn Parallelität wichtiger wird (z.B. in der Spielemaschine). --- src/schule/ngb/zm/TaskRunner.java | 76 +++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/schule/ngb/zm/TaskRunner.java diff --git a/src/schule/ngb/zm/TaskRunner.java b/src/schule/ngb/zm/TaskRunner.java new file mode 100644 index 0000000..57a047a --- /dev/null +++ b/src/schule/ngb/zm/TaskRunner.java @@ -0,0 +1,76 @@ +package schule.ngb.zm; + +import javax.swing.*; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; +import java.util.logging.Logger; + +/** + * Führt Aufgaben (Tasks) parallel zum Hauptprogramm aus. + */ +public class TaskRunner { + + private static final int POOL_SIZE = 4; + + private static final int SHUTDOWN_TIME = 100; + + + private static TaskRunner runner; + + public static TaskRunner getTaskRunner() { + if( runner == null ) { + runner = new TaskRunner(); + } + return runner; + } + + public static void run( Runnable task ) { + TaskRunner r = getTaskRunner(); + r.pool.execute(task); + } + + public static void schedule( Runnable task, int ms ) { + TaskRunner r = getTaskRunner(); + r.pool.schedule(task, ms, TimeUnit.MILLISECONDS); + } + + public static void invokeLater( Runnable task ) { + SwingUtilities.invokeLater(task); + } + + public static void shutdown() { + if( runner != null ) { + runner.pool.shutdown(); + try { + runner.pool.awaitTermination(SHUTDOWN_TIME, TimeUnit.MILLISECONDS); + } catch( InterruptedException ex ) { + + } finally { + if( !runner.pool.isTerminated() ) { + runner.pool.shutdownNow(); + } + } + } + } + + ScheduledExecutorService pool; + + private TaskRunner() { + //pool = new ScheduledThreadPoolExecutor(4); + pool = Executors.newScheduledThreadPool(POOL_SIZE, new ThreadFactory() { + private final ThreadFactory threadFactory = Executors.defaultThreadFactory(); + + @Override + public Thread newThread( Runnable r ) { + Thread t = threadFactory.newThread(r); + t.setDaemon(true); + return t; + } + }); + } + + private static final Logger LOGGER = Logger.getLogger(TaskRunner.class.getName()); + +}