All Downloads are FREE. Search and download functionalities are using the official Maven repository.

mmb.engine.worlds.world.TaskLoop Maven / Gradle / Ivy

Go to download

Dependency for the MultiMachineBuilder, a voxel game about building an industrial empire in a finite world. THIS RELEASE IS NOT PLAYABLE. To play the game, donwload from >ITCH.IO LINK HERE< or >GH releases link here<

The newest version!
/**
 * 
 */
package mmb.engine.worlds.world;

import java.lang.Thread.UncaughtExceptionHandler;

import mmb.NN;

/**
 * Handles ticking
 * @author oskar
 */
public class TaskLoop {
	private final Thread thread;
	private boolean destroyOnFail = false;
	/**
	 * @return will thread be destroyed if it fails?
	 */
	public boolean isDestroyOnFail() {
		return destroyOnFail;
	}
	/**
	 * @param destroyOnFail should this task loop be destroyed if thread fails?
	 */
	public void setDestroyOnFail(boolean destroyOnFail) {
		this.destroyOnFail = destroyOnFail;
	}
	private int state = 0;
	private long next;
	@NN private final Runnable task;
	private final long period;
	/**
	 * @param task task to run
	 * @param period period in nanoseconds
	 */
	public TaskLoop(Runnable task, long period) {
		this.task = task;
		this.period = period;
		thread = new Thread(this::fullRun);
	}
	private void fullRun() {
		Thread thr = Thread.currentThread();
		while(true) {
			if(thr.isInterrupted()) {
				state = 2;
				return;
			}
			long currTime = System.nanoTime();
			if(currTime >= next) {
				//Run the task
				try {
					task.run();
				}catch(Exception e) {
					UncaughtExceptionHandler ueh = thr.getUncaughtExceptionHandler();
					if(ueh != null) ueh.uncaughtException(thr, e);
					if(destroyOnFail) return;
				}
				next += period;
			}else Thread.yield();
		}
	
	}
	public void start() {
		if(state == 1) throw new IllegalStateException("The timer was already started");
		if(state == 2) throw new IllegalStateException("The timer was destroyed");
		next = System.nanoTime();
		state = 1;
		thread.start();
	}
	/**
	 * @return 0 if not started, 1 if running and 2 if destroyed
	 */
	public int getState() {
		return state;
	}
	public void destroy() {
		if(state == 0) throw new IllegalStateException("The timer was not started");
		if(state == 2) throw new IllegalStateException("The timer was destroyed");
		thread.interrupt();
		state = 2;
	}
	/**
	 * Waits until the thread stops
	 * @throws InterruptedException if any thread has interrupted the current thread.
	 * The interrupted status of the current thread is cleared when this exception is thrown.
	 */
	public void join() throws InterruptedException {
		thread.join();
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy