mirror of
https://github.com/jneug/zeichenmaschine.git
synced 2026-04-14 14:43:33 +02:00
Neue Klasse TaskRunner
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).
This commit is contained in:
76
src/schule/ngb/zm/TaskRunner.java
Normal file
76
src/schule/ngb/zm/TaskRunner.java
Normal file
@@ -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());
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user