/******************************************************************************* * 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 * repeatedly 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(); } }