深入研究Java Executor服务框架-第1部分

Introduction:

大家好! 这是我的第一个技术博客,开始在我的领域下撰写。 以前我曾经是博客帖子的狂热用户,但是现在是时候作为内容的制作者进入我自己在互联网上的甜蜜空间了,因为我认为与社区分享我的经验很重要。

Here is the link to the original article !

在此博客文章中,我想详细介绍与JDK 5一起发布的Executor Service框架的实现。它用于使用ThreadPool和ThreadFactory等概念运行Runnable对象。

如果您打算在项目中实现某种并发性,建议您使用像这样的更高级别的框架,而不是从头开始,因为那样可以确保您的代码库不受运行时数据种族的影响 情况,而将大部分繁重的管理线程和同步工作留给了更具确定性的东西

Table of Contents:

  1. Executors.java Factory
  2. ExecutorService Interface
  3. ThreadPool Concept

1. Executors.java Factory

使用Executor Service框架时,我们要做的第一件事是使用Executors工厂类返回实现ExecutorService接口的所有方法的对象的实例。 我们在构造函数上调用公共静态线程池实例创建方法,以获取特定的包装式ExecutorService实现。 一旦获得该服务的实例,我们就可以向该服务提交任务并跟踪每个任务的进度。 您可以在包中找到此类java.util.concurrent。 以下是实现我刚刚讨论的内容的样本片段:

ExecutorService executorService = Executors.newFixedThreadPool(10);

try{
    executorService.execute(new Runnable() {
        public void run() {
            System.out.println("Asynchronous task");
        }
    });
}

finally {
    executorService.shutdown(); 
}

可从Executors类实例化的不同线程池实现是:

  • 固定线程池:创建一个线程池,该线程池重用在共享的无边界队列上操作的固定数量的线程。 在任何时候,最多n线程将是活动的处理任务。 在本系列的第2部分中,我将深入解释该实现的双击。单线程执行器:创建一个单线程执行器,该执行器可以安排命令在给定的延迟后运行或定期执行。 (但是请注意,如果该单线程由于在关闭之前执行期间由于执行失败而终止,则在需要执行新任务时将使用新线程代替。)保证任务按顺序执行,并且活动的任务不超过一个 在任何给定时间。 保证返回的执行程序不可重新配置为使用其他线程。缓存线程池:创建一个线程池,该线程池根据需要创建新线程,但是将在先前构造的线程可用时重用它们。 这些池通常将提高执行许多短期异步任务的程序的性能。

2. ExecutorService Interface

执行者Service接口扩展了执行者接口,该接口是执行提交的对象可运行任务。 此接口提供了一种将任务提交与每个任务将如何运行的机制分离的方法,包括线程使用,调度等的详细信息。执行者通常用于代替显式创建线程。 例如,而不是调用new Thread(new(可运行Task())).start()对于一组任务中的每一个,您都可以使用。 这是实现此接口的具体类:

class ThreadPerTaskExecutor implements Executor {
   public void execute(Runnable r) {
     new Thread(r).start();
   }
}

其调用的片段示例:

Executor executor = new ThreadPerTaskExecutor();
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());

需要由实现类实现的ExecutorService接口的一些主要方法是:

  • void shutdown();:启动有序关闭,在该关闭中执行先前提交的任务,但不接受任何新任务。 如果已关闭,则调用不会产生任何其他影响。List<Runnable> shutdownNow();:尝试停止所有正在执行的任务,暂停正在等待的任务的处理,并返回正在等待执行的任务的列表。boolean isShutdown();:退货真正如果该执行器已关闭。boolean isTerminated();:退货真正如果在关闭后所有任务都已完成。boolean awaitTermination(long timeout,TimeUnit unit)抛出InterruptedException;:阻塞直到关闭*请求后所有任务完成执行,或者发生超时,或者当前线程被中断,以先发生的为准。<T> Future<T> submit(Callable<T> task);:提交要执行的返回值任务,并返回表示任务的未决结果的Future。 未来的得到方法将在成功完成后返回任务的结果。<T> Future<T> submit(Runnable task, T result);:提交一个Runnable任务以执行并返回一个表示该任务的Future。 未来的得到方法将在成功完成后返回给定的结果。<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException;:执行给定的任务,并在所有任务完成时返回保存其状态和结果的期货列表。未来#isDone是真正对于返回列表的每个元素。 请注意已完成 task could have terminated either normally or by throwing an exception. The results of this method are undefined if the given collection是modified while this operation是in progress.

3. Thread Pool Executor

一个的实现执行器服务使用多个池线程中的一个执行每个提交的任务,通常使用执行者工厂方法。 线程池解决了两个不同的问题:由于减少了每个任务的调用开销,它们通常在执行大量异步任务时可提供改进的性能,并且它们提供了一种绑定和管理资源(包括线程)的方法,该资源在执行集合的执行时消耗 任务。 每线程池执行器还维护一些基本统计信息,例如已完成任务的数量。

的线程池执行器范围Abstract执行器服务再次实现执行器服务接口。

ThreadPoolExecutor的构造采用一些强制性参数,以正确的方式使用正确的策略进行初始化:

  public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

您可能想知道corePoolSize,maximumPoolSize和'工作队列'就是在这种情况下进行的。 的corePoolSize告诉线程池执行器初始化一组默认的线程,以准备接收下一个提交的任务。 的工作队列是一个BlockingQueue实现数据结构,用于将超过corePoolSize限制。 一旦corePoolSize is reached,it starts to poll/take this queue for tasks and then schedule one of the existing threads to execute the task. This way,the thread pool executor manages to handle the thead resources in an efficient manner

Closing note

这篇文章是第1部分的3部分系列 that I intend to publish. This gives a good understanding的composition的Executor Service framework implementation and some的core ideas that make this framework easy and effective to use.

如果您有任何疑问或任何建设性的批评,请在下面的评论中忽略!

from: https://dev.to//suhaspbharadwaj/deep-dive-into-java-executor-service-framework---part-1-2ikd

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值