concurrent包与线程池

1.继承体系

starUML运行异常,和c盘存储或目录层次有关


concurrent包与线程池_第1张图片

2.API说明和经典例子

以下文字摘自Executor接口的Java API文档:

执行已提交的 Runnable 任务的对象。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。通常使用Executor 而不是显式地创建线程。例如,可能会使用以下方法,而不是为一组任务中的每个任务调用 new Thread(new(RunnableTask())).start():

 Executor executor = anExecutor;
 executor.execute(new RunnableTask1());
 executor.execute(new RunnableTask2());
 ...
 
不过, Executor 接口并没有严格地要求执行是异步的。在最简单的情况下,执行程序可以 在调用者的线程中立即运行已提交的任务:
 class DirectExecutor implements Executor {
     public void execute(Runnable r) {
         r.run();
     }
 }
更常见的是,任务是 在某个不是调用者线程的线程中执行的。以下执行程序将为每个任务生成一个新线程。
 class ThreadPerTaskExecutor implements Executor {
     public void execute(Runnable r) {
         new Thread(r).start();
     }
 }
许多 Executor 实现都对调度任务的方式和时间强加了某种限制。 以下执行程序使任务提交与第二个执行程序保持连续,这说明了一个复合执行程序。
 class SerialExecutor implements Executor {
     final Queue<Runnable> tasks = new ArrayDeque<Runnable>();
     final Executor executor;
     Runnable active;

     SerialExecutor(Executor executor) {
         this.executor = executor;
     }

     public synchronized void execute(final Runnable r) {
         tasks.offer(new Runnable() {
             public void run() {
                 try {
                     r.run();
                 } finally {
                     scheduleNext();
                 }
             }
         });
         if (active == null) {
             scheduleNext();
         }
     }

     protected synchronized void scheduleNext() {
         if ((active = tasks.poll()) != null) {
             executor.execute(active);
         }
     }
 }
此包中提供的 Executor 实现实现了 ExecutorService,这是一个使用更广泛的接口ThreadPoolExecutor 类提供一个可扩展的线程池实现。 Executors 类为这些 Executor 提供了便捷的工厂方法。

内存一致性效果:线程中将 Runnable 对象提交到 Executor 之前的操作 happen-before 其执行开始(可能在另一个线程中)。

从以下版本开始:
1.5

以下文字摘自ExecutorService的Java API文档:

Executor 提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成Future 的方法。

可以关闭 ExecutorService,这将导致其拒绝新任务。提供两个方法来关闭 ExecutorService。shutdown() 方法在终止前允许执行以前提交的任务,而shutdownNow() 方法阻止等待任务启动并试图停止当前正在执行的任务。在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的ExecutorService 以允许回收其资源。

通过创建并返回一个可用于取消执行和/或等待完成的 Future方法 submit 扩展了基本方法 Executor.execute(java.lang.Runnable)方法 invokeAny 和invokeAll 是批量执行的最常用形式,它们执行任务 collection,然后等待至少一个,或全部任务完成(可使用 ExecutorCompletionService 类来编写这些方法的自定义变体)。

Executors提供了用于此包中所提供的执行程序服务工厂方法

用法示例

下面给出了 一个网络服务的简单结构,这里 线程池中的线程作为传入的请求。它使用了 预先配置的Executors.newFixedThreadPool(int) 工厂方法
 class NetworkService implements Runnable {
    private final ServerSocket serverSocket;
    private final ExecutorService pool;

    public NetworkService(int port, int poolSize)
        throws IOException {
      serverSocket = new ServerSocket(port);
      pool = Executors.newFixedThreadPool(poolSize);
    }
 
    public void run() { // run the service
      try {
        for (;;) {
          pool.execute(new Handler(serverSocket.accept()));
        }
      } catch (IOException ex) {
        pool.shutdown();
      }
    }
  }

  class Handler implements Runnable {
    private final Socket socket;
    Handler(Socket socket) { this.socket = socket; }
    public void run() {
      // read and service request on socket
    }
 }

3.具体知识点与简单例子

以下是ExecutorService启动多线程执行任务的最简单用法,摘自Java编程思想:

concurrent包与线程池_第2张图片

不同的线程池:

concurrent包与线程池_第3张图片

concurrent包与线程池_第4张图片

concurrent包与线程池_第5张图片

你可能感兴趣的:(concurrent包与线程池)