blob: 3d3dc68a6f9ec9ceae4caf13e3f8de09f68d862d [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2009 EclipseSource and others. All rights reserved. This
* program and the accompanying materials are made available under the terms of
* the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* EclipseSource - initial API and implementation
******************************************************************************/
package org.eclipse.equinox.concurrent.future;
import org.eclipse.core.runtime.IProgressMonitor;
/**
* <p>
* Contract for the actual execution of {@link IProgressRunnable}s. Instances of
* this interface must be able to provide resources to eventually execute a given
* {@link IProgressRunnable}, upon calling {@link #execute(IProgressRunnable, IProgressMonitor)}.
* </p>
* <p>
* Note that implementations may decide what/how to execute the given IProgressRunnable (i.e.
* via a {@link Thread}, or a Job, or a ThreadPool or some other invocation mechanism.
* But the intended contract of {@link #execute(IProgressRunnable, IProgressMonitor)} is that
* the {@link IProgressRunnable#run(IProgressMonitor)} method will be invoked by
* this executor in a timely manner <b>without</b> blocking.
* </p>
*
* @see IProgressRunnable
* @see IFuture
* @see #execute(IProgressRunnable, IProgressMonitor)
*/
public interface IExecutor {
/**
* <p>
* Execute the given {@link IProgressRunnable} (i.e. call {@link IProgressRunnable#run(IProgressMonitor)}.
* Will return a non-<code>null</code> instance of {@link IFuture} that allows
* clients to inspect the state of the execution and retrieve any results via {@link IFuture#get()}
* or {@link IFuture#get(long)}.
* </p>
* <p>
* Note that implementers may decide whether to invoke {@link IProgressRunnable#run(IProgressMonitor)}
* asynchronously or synchronously, but since IProgressRunnables are frequently going to be longer-running
* operations, implementers should proceed carefully before implementing with synchronous (blocking)
* invocation. Implementers should typically implement via some non-blocking asynchronous invocation
* mechanism, e.g. Threads, Jobs, ThreadPools etc.
* </p>
* @param runnable the {@link IProgressRunnable} to invoke. Must not be <code>null</code>.
* @param monitor any {@link IProgressMonitor} to be passed to the runnable. May be <code>null</code>.
* @return {@link IFuture} to allow for inspection of the state of the computation by clients,
* as well as access to any return values of {@link IProgressRunnable#run(IProgressMonitor)}. Will not
* be <code>null</code>.
*/
IFuture execute(IProgressRunnable runnable, IProgressMonitor monitor);
}