Class Executors(线程池创建工厂类)

Interface ExecutorService

  • All Superinterfaces:

    Executor

    All Known Subinterfaces:

    ScheduledExecutorService

    所有已知实现类:

    AbstractExecutorService , ForkJoinPool , ScheduledThreadPoolExecutor , ThreadPoolExecutor


    public interface ExecutorServiceextends Executor

    Executor ,提供管理终止的方法和可生成Future以跟踪一个或多个异步任务进度的方法。

    可以关闭ExecutorService ,这将导致它拒绝新任务。 关闭ExecutorService提供了两种不同的方法。 shutdown()方法将允许先前提交的任务在终止之前执行,而shutdownNow()方法可防止等待任务启动并尝试停止当前正在执行的任务。 终止时,执行程序没有正在执行的任务,没有等待执行的任务,也没有任何新任务可以提交。 应关闭未使用的ExecutorService以允许回收其资源。

    方法submit延伸的基方法Executor.execute(Runnable)通过创建并返回一个Future ,可用于取消执行和/或等待完成。 方法invokeAny和invokeAll执行最常用的批量执行形式,执行一组任务,然后等待至少一个或全部完成。 ( 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 } }

    以下方法ExecutorService两个阶段关闭ExecutorService ,首先调用shutdown拒绝传入任务,然后根据需要调用shutdownNow以取消任何延迟任务:

    void shutdownAndAwaitTermination(ExecutorService pool) { pool.shutdown(); // Disable new tasks from being submitted try { // Wait a while for existing tasks to terminate if (!pool.awaitTermination(60, TimeUnit.SECONDS)) { pool.shutdownNow(); // Cancel currently executing tasks // Wait a while for tasks to respond to being cancelled if (!pool.awaitTermination(60, TimeUnit.SECONDS)) System.err.println("Pool did not terminate"); } } catch (InterruptedException ie) { // (Re-)Cancel if current thread also interrupted pool.shutdownNow(); // Preserve interrupt status Thread.currentThread().interrupt(); } }

    内存一致性效果:在将Runnable或Callable任务提交到ExecutorService happen-before之前的一个线程中的操作,该任务采取的任何操作都会发生 - 在通过Future.get()检索结果之前 。

    从以下版本开始:

    1.5

    变量和类型

    方法

    描述

    boolean

    awaitTermination(long timeout, TimeUnit unit)

    阻止所有任务在关闭请求之后完成执行,或发生超时,或者当前线程被中断,以先发生者为准。

    <T> List<Future<T>>

    invokeAll(Collection<? extends Callable<T>> tasks)

    执行给定的任务,返回完成所有状态和结果的Futures列表。

    <T> List<Future<T>>

    invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)

    执行给定的任务,返回一个Futures列表,在完成或超时到期时保持其状态和结果,以先发生者为准。

    <T> T

    invokeAny(Collection<? extends Callable<T>> tasks)

    执行给定的任务,返回已成功完成的任务的结果(即,不抛出异常),如果有的话。

    <T> T

    invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)

    执行给定的任务,返回已成功完成的任务的结果(即,不抛出异常),如果在给定的超时之前已经执行了任何操作。

    boolean

    isShutdown()

    如果此执行程序已关闭,则返回 true 。

    boolean

    isTerminated()

    如果关闭后所有任务都已完成,则返回 true 。

    void

    shutdown()

    启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。

    List<Runnable>

    shutdownNow()

    尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。

    Future<?>

    submit(Runnable task)

    提交Runnable任务以执行并返回表示该任务的Future。

    <T> Future<T>

    submit(Runnable task, T result)

    提交Runnable任务以执行并返回表示该任务的Future。

    <T> Future<T>

    submit(Callable<T> task)

    提交值返回任务以执行并返回表示任务的挂起结果的Future。

    • 方法摘要

      • 声明方法的接口 java.util.concurrent.Executor

        void execute(Runnable command)

      • 在将来的某个时间执行给定的命令。 该命令可以在新线程,池化线程或调用线程中执行,由Executor实现自行决定                                

Class Executors(线程池创建工厂类)

java.lang.Objectjava.util.concurrent.Executors

 

示例:

 

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

 * @author Administrator

 *线程池

 *线程池的创建方式:

1. newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

2. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

3. newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

4. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

 *线程池执行:

- execute(Runnable)   方法接收一个Runnable实例,并且异步的执行

- submit(Runnable)    方法接收一个Runnable实例,并且异步的执行,并返回的Future对象 get()【阻塞】方法获取返回结果

- submit(Callable)    方法submit(Callable)和submit(Runnable)类似,也会返回一个Future对象,但是除此之外,submit(Callable)接收的是一个Callable的实现,Callable接口中的call()方法有一个返回值,可以返回任务的执行结果,而Runnable接口中的run()方法是void的,没有返回值

- invokeAny(...)

- invokeAll(...)

 */

public class Demo6 {

    static int count = 0;

    public static void main(String[] args) {

         ///

         ExecutorService threadPool = Executors.newCachedThreadPool();

         for (int i = 0; i < 1000; i++) {

             threadPool.execute(new Runnable() {

                 @Override

                 public void run() {

                      if("pool-1-thread-1".equals(Thread.currentThread().getName()))

                      {

                          count++;

                      }

//                    System.out.println(Thread.currentThread().getName());

                 }

             });

         }

         //关闭线程池

         threadPool.shutdown();

    }

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值