您的位置:首页 > 其它

几个任务执行相关的类

2013-03-16 16:22 375 查看

Runnable

正面就是Runnable的完整定义,非常简单。

public interface Runnable {
public abstract void run();
}


Callable

Callable和Runnable的功能非常相似,一样的简捷,但是Callable更强大。
public interface Callable<V> {
V call() throws Exception;
}
首先说明一点,interface中的方法必然都是抽象方法,"abstract"关键字可以不写。
与Runnable的三点不同:

Callable是基于泛型的,而Runnable不是。
Callable可以返回一个值,而Runnable不可以。
Callable可以抛出异常,而Runnable捕获异常后必须自己处理,不能抛出。

Thread

public class Thread implements Runnable {
...
}
启动一个线程要使用start(),而不要去调用run()。stop()、destroy()suspend()、resume()已经废弃不再建议使用了。

Future

public interface Future<V> {

boolean cancel(boolean mayInterruptIfRunning);

boolean isCancelled();

boolean isDone();

V get() throws InterruptedException, ExecutionException;

V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
cancel用于取消任务的执行,取消成功后返回true,然后任务就再也不能被执行了,参数mayInterrupted决定是否让执行任务的线程被中断。

当任务在完成之前被取消则isCancelled返回true。

当任务正常完成、或被取消、或收到异常,则isDone返回true。

get()阻塞直到计算完成,并返回计算结果。

Executor

Executor框架主要是作为线程池来使用的。
public interface Executor {
void execute(Runnable command);
}

提交给Executor去执行的任务可以是一个Runnable,下面马上可以看到提交给ExecutorService去执行的任务除了Runnable,也可以是Callable。而ExecutorService继承了Executor。

ExecutorService

public interface ExecutorService extends Executor {

void shutdown();

List<Runnable> shutdownNow();

boolean isShutdown();

boolean isTerminated();

boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;

<T> Future<T> submit(Callable<T> task);

<T> Future<T> submit(Runnable task, T result);

Future<?> submit(Runnable task);

<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException;

<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException;

<T> T invokeAny(Collection<? extends Callable<T>> tasks)
throws InterruptedException, ExecutionException;

<T> T invokeAny(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
shutdown是不接收新的任务,但队列中等待的任务还会将它们执行完。shutdownNow是立即强行关闭,并且返回从未开始执行的任务列表。isDhutdown关心Executor是不是shutdown了,而isTerminated关心是不是所有的Tasks已经shutdown了。
awaitTermination将一直阻塞,直到以下3者之一发生:

调用了shutdown,且所有任务都已结束。
超时timeout
抛出异常

submit用于提交一个任务去执行,返回一个Future,通过Future的get()方法来获得任务运行的结果。

InvokeAll提交一组任务,并且返回一组Future。与submit不同,InvokeAll只有当所有任务都完成后才返回--除非调用者线程被中断或者超时,若超时,那么没有被执行的任务将被取消。这样一来,InvokeAll返回的Future列表在调用IsDone时都将返回true。
当Tasks中任意一个完成时,invokeAny就将返回其计算结果,剩下的没有执行完的任务将被取消。注意如果在invokeAny运行期间,collection参数被修改了,那invokeAny返回的结果是不可预知的。

Executors

Executors提供一系列的静态工厂方法用于产生ExecutorSerive、ScheduledExecutorService、ThreadFactory和Callable。

RunnableFuture

public interface RunnableFuture<V> extends Runnable, Future<V> {
void run();
}

FutureTask

FutureTask通常用于封装一个Callable或Runnable对象,由于它继承了Runnable,所以它可以交给Executor去执行。它有一个内部类Sync,用于同步控制。
public class FutureTask<V> implements RunnableFuture<V> {
private final Sync sync;

public FutureTask(Callable<V> callable) {
if (callable == null)
throw new NullPointerException();
sync = new Sync(callable);
}

public FutureTask(Runnable runnable, V result) {
sync = new Sync(Executors.callable(runnable, result));
}

public boolean isCancelled() {
return sync.innerIsCancelled();
}

public boolean isDone() {
return sync.innerIsDone();
}

public boolean cancel(boolean mayInterruptIfRunning) {
return sync.innerCancel(mayInterruptIfRunning);
}

public V get() throws InterruptedException, ExecutionException {
return sync.innerGet();
}

public V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException {
return sync.innerGet(unit.toNanos(timeout));
}

protected void done() { }

protected void set(V v) {
sync.innerSet(v);
}

protected void setException(Throwable t) {
sync.innerSetException(t);
}

public void run() {
sync.innerRun();
}

protected boolean runAndReset() {
return sync.innerRunAndReset();
}
}


CompletionService

如果向Excutor提交了一组任务,并且希望在计算完成之后获取结果,需要调用Future的get通过轮询的方法来判断任务是否完成。这种方法有些繁琐。CompletionService将Executor和BlockingQueue整合在一起,可以提交Callable给它执行,然后使用类似于队列操作take()和poll()等方法来获得已完成的结果,而这些结果在完成时被封装为Future。
public interface CompletionService<V> {

Future<V> submit(Callable<V> task);

Future<V> submit(Runnable task, V result);

Future<V> take() throws InterruptedException;

Future<V> poll();

Future<V> poll(long timeout, TimeUnit unit) throws InterruptedException;
}
take和poll都将移除队首元素,不同的是:当目前没有任务完成时take将一直阻塞,而poll将立即返回null。
ExecutorCompletionService是CompletionService的具体实现类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: