Netty进阶之EventExecutorGroup源码详解

 更新时间:2023年11月16日 10:44:19   作者:立小研先森  
这篇文章主要介绍了Netty进阶之EventExecutorGroup源码详解,EventExecutorGroup继承了JDK的ScheduledExecutroService,那么它就拥有了执行定时任务,执行提交的普通任务,需要的朋友可以参考下

前言

EventExecutorGroup继承了JDK的ScheduledExecutroService,那么它就拥有了执行定时任务,执行提交的普通任务;

EventExecutorGroup还继承了JDK的Iterable接口,表示EventExecutorGroup是可遍历的,它的遍历对象是EventExecutor;

一、Iterable相关方法

EventExecutorGroup中有两个Iterable相关的方法:

    //返回一个被当前EventExecutorGroup管理的EventExecutor对象
		EventExecutor next();
    //返回一个EventExecutor类型的迭代器
    @Override
    Iterator<EventExecutor> iterator();

二、execute

接口Executor提供了一个提交执行任务的方法execute

    //返回一个被当前EventExecutorGroup管理的EventExecutor对象
		EventExecutor next();
    //返回一个EventExecutor类型的迭代器
    @Override
    Iterator<EventExecutor> iterator();

三、Executor的子接口ExecutorService

public interface ExecutorService extends Executor {

    /**
     * 启动有序关闭,在关闭过程中会继续执行以前提交的任务,但是不接受新的任务
     */
    void shutdown();

    /**
     * 尝试停止所有正在执行的任务,停止处理等待的任务,并返回一个等待执行的任务列表
     */
    List<Runnable> shutdownNow();

    /**
     * 如果此执行程序已关闭,则返回true
     */
    boolean isShutdown();

    /**
     * 如果关闭后所有任务都已完成,则返回true
     * 只有首先调用了shutdown()、shutdownNow()方法才有可能返回true,否则一定为false
     */
    boolean isTerminated();

    /**
     * 阻塞,shutdown后所有任务执行完成、超时、当前线程被终端,那个先发生那个优先;
     */
    boolean awaitTermination(long timeout, TimeUnit unit)
        throws InterruptedException;

    /**
     * 提交一个带返回值的执行任务,并返回一个Future代表将要返回的任务结果
     */
    <T> Future<T> submit(Callable<T> task);

    /**
     * 提交一个可运行任务以供执行,并返回一个表示该任务的Future。Future的get方法将在成功完成后返回给定的结果。
     */
    <T> Future<T> submit(Runnable task, T result);

    /**
     * 提交一个可运行任务以供执行,并返回一个表示该任务的Future。Future的get方法在成功完成后将返回null。
     */
    Future<?> submit(Runnable task);

    /**
     * 执行给定的多个任务,返回一个持有执行状态和结果的Future列表。
     */
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
        throws InterruptedException;

    /**
     * 执行给定的多个任务,返回一个持有执行状态和结果的Future列表。
     * 当所有的任务完成或超时过期Future#isDone都将返回ture
     */
    <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;
}

下面是一个网络服务案例,其中线程池中的线程为传入请求提供服务,它使用预先配置的Executors.newFixedThreadPool工厂方法:

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分两个阶段,首先通过调用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();
        }
    }

四、ExecutorService的子接口ScheduledExecutorService

ScheduledExecutorService接口提供了四个新的方法schedule延迟指定的时间执行任务,scheduleAtFixedRate方法延迟指定时间、按照固定的时间频率执行任务。

public interface ScheduledExecutorService extends ExecutorService {
    /**
     * 提交一个一次性任务,该任务在给定延迟后变为启用状态。
     *
     * @param command 要执行的任务
     * @param delay 从现在开始延迟执行的时间
     * @param unit delay参数的时间单位
     * @return 一个ScheduledFuture,标识任务的挂起完成,其get方法将在完成时返回null
     */
    public ScheduledFuture<?> schedule(Runnable command,
                                       long delay, TimeUnit unit);
    /**
     * 提交一个带返回值的一次性任务,该任务在给定延迟后变为启用状态
     *
     * @param callable 要执行的函数任务
     * @param delay 从现在开始延迟执行的时间
     * @param unit delay参数的时间单位
     * @param <V> the type of the callable's result
     * @return 可用于提取结果或取消的ScheduledFuture
     */
    public <V> ScheduledFuture<V> schedule(Callable<V> callable,
                                           long delay, TimeUnit unit);
    /**
     * 提交一个可执行任务,延迟指定时间,然后按照period时间间隔执行任务
     */
    public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
                                                  long initialDelay,
                                                  long period,
                                                  TimeUnit unit);
    /**
     * 提交一个可执行任务,延迟指定时间,然后按照period时间间隔执行任务
     */
    public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                     long initialDelay,
                                                     long delay,
                                                     TimeUnit unit);
}

五、ScheduledExecutorService的子接口EventExecutorGroup

EventExecutorGroup新增了三个方法:

  • isShuttingDown:当且仅当此EventExecutorGroup管理的所有EventExecutor正在正常关闭或已关闭时,返回true
  • shutdownGracefully:指定了超时时间的优雅关闭方法;

到此这篇关于Netty进阶之EventExecutorGroup源码详解的文章就介绍到这了,更多相关EventExecutorGroup源码详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • BaseJDBC和CRUDDAO的写法实例代码

    BaseJDBC和CRUDDAO的写法实例代码

    这篇文章主要介绍了BaseJDBC和CRUDDAO的写法实例代码,代码注释十分详细,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • Java测试框架Mockito的简明教程

    Java测试框架Mockito的简明教程

    这篇文章主要介绍了Java测试框架Mockito的简明教程,Mock 测试是单元测试的重要方法之一。本文介绍了基于 Java 语言的 Mock 测试框架 – Mockito 的使用。,需要的朋友可以参考下
    2019-06-06
  • 详解Java中的流程控制

    详解Java中的流程控制

    今天带大家复习Java基础知识,文中对Java流程控制作了非常详细的介绍及代码示例,对正在学习Java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • 将对象转化为字符串的java实例

    将对象转化为字符串的java实例

    这篇文章主要介绍了将对象转化为字符串的java实例,有需要的朋友可以参考一下
    2013-12-12
  • Java实现断点下载服务端与客户端的示例代码

    Java实现断点下载服务端与客户端的示例代码

    这篇文章主要为大家介绍了如何实现服务端(Spring Boot)与客户端(Android)的断点下载与下载续传功能,文中的示例代码讲解详细,需要的可以参考一下
    2022-08-08
  • JAVA使用JDBC技术操作SqlServer数据库实例代码

    JAVA使用JDBC技术操作SqlServer数据库实例代码

    本篇文章主要介绍了JAVA使用JDBC技术操作SqlServer数据库实例代码,具有一定的参考价值,有兴趣的可以了解一下。
    2017-01-01
  • SpringBoot实现HTTP调用的7 种方式

    SpringBoot实现HTTP调用的7 种方式

    本文主要介绍了SpringBoot实现HTTP调用的7 种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Java多线程 ReentrantReadWriteLock原理及实例详解

    Java多线程 ReentrantReadWriteLock原理及实例详解

    这篇文章主要介绍了Java多线程 ReentrantReadWriteLock原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java 网络编程总结

    Java 网络编程总结

    这篇文章主要给大家分享Java 网络编程的一个总结,说到网络编程肯定都会想到IP地址、端口、通信协议等一些必不可少的元素,下面来看看文章的详细介绍吧
    2021-11-11
  • SpringBoot实现发送短信的示例代码

    SpringBoot实现发送短信的示例代码

    这篇文章主要介绍了SpringBoot实现发送短信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论