/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.toolkit.modules.concurrency.api;
import java.util.concurrent.TimeoutException;
/**
* A queue where {@link Runnable}s can be added to be executed asynchronously, but in the order they were enqueued in, with no overlap
* between the individual {@link Runnable}s. Execution is delegated to a {@link AsyncTaskService} provided at creation.
*
* @author Robert Mischke
*/
public interface AsyncOrderedExecutionQueue {
/**
* The common category name to count statistics for tasks executed through this class under. This simplifies the monitoring of the tasks
* are executed via this mechanism. - misc_ro
* <p>
* Example: StatsCounter.count(AsyncOrderedExecutionQueue.STATS_COUNTER_SHARED_CATEGORY_NAME, "my custom task name")
*/
@Deprecated
// TODO find a better place/solution for this
String STATS_COUNTER_SHARED_CATEGORY_NAME = "AsyncOrderedExecutionQueue dispatch";
/**
* Enqueues a {@link Runnable} task for execution. All tasks are guaranteed to be executed in the order they were enqueued in.
*
* @param task the task to enqueue
*/
void enqueue(Runnable task);
/**
* Gracefully cancels this queue. All pending elements are removed, and no more tasks are started. This call does not interrupt the
* currently running task, if one exists, but it does not wait for its completion either.
*/
void cancelAsync();
/**
* Gracefully cancels this queue. All pending elements are removed, and no more tasks are started. If a task is currently running, it is
* not interrupted, but this method will wait until it completes by itself (with a timeout).
*
* @throws TimeoutException if an internal time limit (currently 30 seconds) is exceeded while waiting for the current task to complete
*/
void cancelAndWaitForLastRunningTask() throws TimeoutException;
/**
* Gracefully cancels this queue. All pending elements are removed, and no more tasks are started. This call does not interrupt the
* currently running task, if one exists.
*
* @param waitForShutdown if true, this task waits until the last running job (if it exists) has finished; otherwise, this method always
* returns immediately
* @throws TimeoutException if an internal time limit (currently 30 seconds) is exceeded while waiting
*/
// use the above methods for clarity
void cancel(boolean waitForShutdown) throws TimeoutException;
}