/*
 
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 
*
 
* This code is free software; you can redistribute it and/or modify it
 
* under the terms of the GNU General Public License version 2 only, as
 
* published by the Free Software Foundation.
  
Oracle designates this
 
* particular file as subject to the "Classpath" exception as provided
 
* by Oracle in the LICENSE file that accompanied this code.
 
*
 
* This code is distributed in the hope that it will be useful, but WITHOUT
 
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 
* FITNESS FOR A PARTICULAR PURPOSE.
  
See the GNU General Public License
 
* version 2 for more details (a copy is included in the LICENSE file that
 
* accompanied this code).
 
*
 
* You should have received a copy of the GNU General Public License version
 
* 2 along with this work; if not, write to the Free Software Foundation,
 
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 
*
 
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 
* or visit www.oracle.com if you need additional information or have any
 
* questions.
 
*/

/*
 
* This file is available under and governed by the GNU General Public
 
* License version 2 only, as published by the Free Software Foundation.
 
* However, the following notice accompanied the original version of this
 
* file:
 
*
 
* Written by Doug Lea with assistance from members of JCP JSR-166
 
* Expert Group and released to the public domain, as explained at
 
* http://creativecommons.org/publicdomain/zero/1.0/
 
*/


package java.util.concurrent;

/**
 
* A {@code Future} represents the result of an asynchronous
 
* computation.
  
Methods are provided to check if the computation is
 
* complete, to wait for its completion, and to retrieve the result of
 
* the computation.
  
The result can only be retrieved using method
 
* {@code get} when the computation has completed, blocking if
 
* necessary until it is ready.
  
Cancellation is performed by the
 
* {@code cancel} method.
  
Additional methods are provided to
 
* determine if the task completed normally or was cancelled. Once a
 
* computation has completed, the computation cannot be cancelled.
 
* If you would like to use a {@code Future} for the sake
 
* of cancellability but not provide a usable result, you can
 
* declare types of the form {@code Future<?>} and
 
* return {@code null} as a result of the underlying task.
 
*
 
* <p>
 
* <b>Sample Usage</b> (Note that the following classes are all
 
* made-up.)
 
* <pre> {@code
 
* interface ArchiveSearcher { String search(String target); }
 
* class App {
 
*
   
ExecutorService executor = ...
 
*
   
ArchiveSearcher searcher = ...
 
*
   
void showSearch(final String target)
 
*
       
throws InterruptedException {
 
*
     
Future<String> future
 
*
       
= executor.submit(new Callable<String>() {
 
*
         
public String call() {
 
*
             
return searcher.search(target);
 
*
         
}});
 
*
     
displayOtherThings(); // do other things while searching
 
*
     
try {
 
*
       
displayText(future.get()); // use future
 
*
     
} catch (ExecutionException ex) { cleanup(); return; }
 
*
   
}
 
* }}</pre>
 
*
 
* The {@link FutureTask} class is an implementation of {@code Future} that
 
* implements {@code Runnable}, and so may be executed by an {@code Executor}.
 
* For example, the above construction with {@code submit} could be replaced by:
 
*
  
<pre> {@code
 
* FutureTask<String> future =
 
*
   
new FutureTask<String>(new Callable<String>() {
 
*
     
public String call() {
 
*
       
return searcher.search(target);
 
*
   
}});
 
* executor.execute(future);}</pre>
 
*
 
* <p>Memory consistency effects: Actions taken by the asynchronous computation
 
*<a href="package-summary.html#MemoryVisibility"> <i>happen-before</i></a>
 
* actions following the corresponding {@code Future.get()} in another thread.
 
*
 
* @see FutureTask
 
* @see Executor
 
* @since 1.5
 
* @author Doug Lea
 
* @param <V> The result type returned by this Future's {@code get} method
 
*/

public interface Future<V> {

    
/**
     
* Attempts to cancel execution of this task.
  
This attempt will
     
* fail if the task has already completed, has already been cancelled,
     
* or could not be cancelled for some other reason. If successful,
     
* and this task has not started when {@code cancel} is called,
     
* this task should never run.
  
If the task has already started,
     
* then the {@code mayInterruptIfRunning} parameter determines
     
* whether the thread executing this task should be interrupted in
     
* an attempt to stop the task.
     
*
     
* <p>After this method returns, subsequent calls to {@link #isDone} will
     
* always return {@code true}.
  
Subsequent calls to {@link #isCancelled}
     
* will always return {@code true} if this method returned {@code true}.
     
*
     
* @param mayInterruptIfRunning {@code true} if the thread executing this
     
* task should be interrupted; otherwise, in-progress tasks are allowed
     
* to complete
     
* @return {@code false} if the task could not be cancelled,
     
* typically because it has already completed normally;
     
* {@code true} otherwise
     
*/

    
boolean cancel(boolean mayInterruptIfRunning);

    
/**
     
* Returns {@code true} if this task was cancelled before it completed
     
* normally.
     
*
     
* @return {@code true} if this task was cancelled before it completed
     
*/

    
boolean isCancelled();

    
/**
     
* Returns {@code true} if this task completed.
     
*
     
* Completion may be due to normal termination, an exception, or
     
* cancellation -- in all of these cases, this method will return
     
* {@code true}.
     
*
     
* @return {@code true} if this task completed
     
*/

    
boolean isDone();

    
/**
     
* Waits if necessary for the computation to complete, and then
     
* retrieves its result.
     
*
     
* @return the computed result
     
* @throws CancellationException if the computation was cancelled
     
* @throws ExecutionException if the computation threw an
     
* exception
     
* @throws InterruptedException if the current thread was interrupted
     
* while waiting
     
*/

    
V get() throws InterruptedException, ExecutionException;

    
/**
     
* Waits if necessary for at most the given time for the computation
     
* to complete, and then retrieves its result, if available.
     
*
     
* @param timeout the maximum time to wait
     
* @param unit the time unit of the timeout argument
     
* @return the computed result
     
* @throws CancellationException if the computation was cancelled
     
* @throws ExecutionException if the computation threw an
     
* exception
     
* @throws InterruptedException if the current thread was interrupted
     
* while waiting
     
* @throws TimeoutException if the wait timed out
     
*/

    
V get(long timeout, TimeUnit unit)
        
throws InterruptedException, ExecutionException, TimeoutException;
}