java执行器

Executor

  执行已提交的 Runnable 任务对象。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。Executor 接口并没有严格地要求执行是异步的。

public interface Executor {
    void execute(Runnable command);
}

ExecutorService

  ExecutorService是Executor的子类,扩展了更多的方法。提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。 可以关闭 ExecutorService,这将导致其拒绝新任务。

  提供两个方法来关闭 ExecutorService。 shutdown()方法在终止前允许执行以前提交的任务,而 shutdownNow() 方法阻止等待任务的启动并试图停止当前正在执行的任务。

     关闭任务执行,已经提交的会等执行完再关闭*/
    void shutdown();

    /**
     * 立即关闭任务执行*/
    List<Runnable> shutdownNow();

    /**
     是否被shutdown*/
    boolean isShutdown();

    /**
       在shutdown方法被调用后,如果所有任务结束则返回true*/
    boolean isTerminated();

    /**
    在shutdown方法被调用后,阻塞直到所有任务完成。可以设置timeout时间,如果超时,返回false。
*/ boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;

   提供三个方法来跟踪一个异步任务执行。

/**
     * 执行一个callable,返回一个future*/
    <T> Future<T> submit(Callable<T> task);

    /**
     * 执行一个callable,返回一个future,通过future的get方法获得result值。*/
    <T> Future<T> submit(Runnable task, T result);

    /**
     *执行一个runnable,返回一个future*/
    Future<?> submit(Runnable task);

  提供四个方法来执行批量任务

/**
     执行多个callable,返回多个future,该方法会一直阻塞到所有任务完成*/
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
        throws InterruptedException;

    /**
    执行多个callable,返回多个future,该方法会一直阻塞到所有任务完成,如果timeout,抛出异常,取消尚未执行的任务*/
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
                                  long timeout, TimeUnit unit)
        throws InterruptedException;

    /**
     * 任意一个callable执行成功后返回,取消尚未执行完的任务*/
    <T> T invokeAny(Collection<? extends Callable<T>> tasks)
        throws InterruptedException, ExecutionException;

    /**
     * 任意一个callable执行成功后返回,取消尚未执行的任务,如果timeout,抛出异常,取消尚未执行的任务*/
    <T> T invokeAny(Collection<? extends Callable<T>> tasks,
                    long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;

 ThreadPoolExecutor

  ThreadPoolExecutor是ExecutorService的一个实现类,它使用池线程执行每个提交的任务。

  ThreadPoolExecutor内部用一个变量保存了两个内容:所有有效线程的数量各个线程的状态(runState)。

private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));

  ThreadPoolExecutor内部有一个队列,当提交任务时,首先会提交到队列中,执行任务时会从队列中获取任务。

  ThreadPoolExecutor将根据corePoolSize(参见 getCorePoolSize())和 maximumPoolSize(参见 getMaximumPoolSize()) 设置的边界自动调整池大小。当新任务在方法 execute(java.lang.Runnable) 中提交时,如果运行的线程少于 corePoolSize, 则创建新线程来处理请求,即使有线程是空闲的。 如果运行的线程多于 corePoolSize 而少于 maximumPoolSize,则仅当队列满时才创建新线程。 如果设置的 corePoolSize 和 maximumPoolSize 相同,则创建了固定大小的线程池。 如果将 maximumPoolSize 设置为基本的无界值(如 Integer.MAX_VALUE),则允许池适应任意数量的并发任务。

原文地址:https://www.cnblogs.com/zhangwanhua/p/7874670.html