/*******************************************************************************
 * Copyright 2011 See AUTHORS file.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/

package com.badlogic.gdx.utils;

/** A pausable thread. The runnable must not execute an inifite loop but should return control to the thread as often as possible
 * so that the thread can actually pause.
 * 
 * @author mzechner */
public class PauseableThread extends Thread {
	final Runnable runnable;
	boolean paused = false;
	boolean exit = false;

	/** Constructs a new thread setting the runnable which will be called repeatadly in a loop.
	 * 
	 * @param runnable the runnable. */
	public PauseableThread (Runnable runnable) {
		this.runnable = runnable;
	}

	public void run () {
		while (true) {
			synchronized (this) {
				try {
					while (paused)
						wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}

			if (exit) return;

			runnable.run();
		}
	}

	/** Pauses the thread. This call is non-blocking */
	public void onPause () {
		paused = true;
	}

	/** Resumes the thread. This call is non-blocking */
	public void onResume () {
		synchronized (this) {
			paused = false;
			this.notifyAll();
		}
	}

	/** @return whether this thread is paused or not */
	public boolean isPaused () {
		return paused;
	}

	/** Stops this thread */
	public void stopThread () {
		exit = true;
		if (paused) onResume();
	}
}
