jdk中的简单并发,需要掌握

  • 时间:
  • 浏览:1
  • 来源:5分时时彩官网_5分时时彩玩法_5分时时彩技巧

前言

  开心一刻

    小事先有一次爸爸带我去偷村头别人家的梨子,我上树摘,爸爸在下面放风,正摘着主人来了,爸爸指着我破口大骂:臭小子,赶紧给我滚下来,敢偷吃别人家梨子,看我不打死你。主人家赶紧说:没事没事,小孩子淘气嘛,多摘点回家吃。我……这坑儿子的爹...

纯正的海豹突击队

  路漫漫其修远兮,吾将上下而求索!

  github:https://github.com/youzhibing

  码云(gitee):https://gitee.com/youzhibing

Runnable

  机会是简单的实现有一个多多 多tcp连接,我们都都 会通过实现Runnable接口或继承Thread类来完成。JDK1.0中就机会地处Runnable和Thread,Thread实现了Runnable接口。Runnable使用辦法 一般如下

  一般我们都都 的tcp连接全部都是以匿名实物类的辦法 地处的,假如有一天以如下辦法 地处

  当然tcp连接的实现辦法 还有Thread类,Thread实现了Runnable接口,本质还是一样;无论是Runnable,还是Thread,实现的tcp连接有一个多多 多多很明显的缺点,假如有一天只有 返回值,执行完任务事先无法获取执行结果。

Callable

  Callable接口是JDK1.5中引入的,和Runnable类似于,全部都是用来实现多tcp连接,不同的是,Callable能返回结果和抛出checked exception。源代码如下

@FunctionalInterface
public interface Callable<V> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}

  都可否否看了,Callable是有一个多多 多泛型接口,call()函数返回的类型假如有一天传递进来的泛型类型,也是返回的结果类型。只有 为什使用Callable呢?一般状态下是配合ExecutorService来使用的,而ExecutorService的创建又是用Executors来完成的。

tcp连接池

  Executors

    也是JDK1.5新增内容,是创建ExecutorService、ScheduledExecutorService、ThreadFactory和Callable的工厂,并提供了一点有效的工具辦法 。有而是 创建ExecutorService的辦法

    主要分为6类辦法 ,每一类都两两重载,有一个多多 多有ThreadFactory threadFactory参数,有一个多多 多只有 ThreadFactory threadFactory参数,也就全部都是我们都都 都可否否自定义ThreadFactory来定制Thread;若只有 ThreadFactory参数,则使用默认的DefaultThreadFactory来构建Thread。6类辦法 如下

      newCachedThreadPool(...)

        创建有一个多多 多可缓存的tcp连接池,机会tcp连接池长度超过处里需用,可灵活回收空闲tcp连接,若无可回收,则新建tcp连接;返回类型是:ThreadPoolExecutor。

      newFixedThreadPool(...)

        创建有一个多多 多定长tcp连接池,可控制tcp连接最大并发数,超出的tcp连接会在队列中等待时间;返回类型是:ThreadPoolExecutor。

      newScheduledThreadPool(...)

        创建有一个多多 多定长tcp连接池,支持定时及周期性任务执行;返回类型是:ScheduledThreadPoolExecutor。多数状态下可用来替代Timer类。

      newSingleThreadExecutor(...)

        创建有一个多多 多单tcp连接化的tcp连接池,只有唯一的有一个多多 多工作tcp连接来执行任务,保证所有任务按照指定顺序执行;返回类型是:ThreadPoolExecutor的代理,我们都都 都可否否认为假如有一天ThreadPoolExecutor。

      newSingleThreadScheduledExcutor(...)

        创建有一个多多 多单tcp连接化的tcp连接池,与newSingleThreadExecutor类似于,但支持定时及周期性任务执行;返回类型是:ScheduledThreadPoolExecutor。

      newWorkStealingPool(...)

        创建持有足够tcp连接的tcp连接池来支持给定的并行级别,并通过使用多个队列,减少竞争;它需用穿有一个多多 多并行级别的参数,机会不传,则被设定为默认的CPU数量。JDK1.8中新增,返回类型是:ForkJoinPool。ForkJoinFool通常配合ForkJoinTask的子类RecursiveAction或RecursiveTask使用。

    常用的主假如有一天以下3类:newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool。至于newWorkStealingPool,我还没用过,不太好评论。

  ExecutorService

    ExecutorService是有一个多多 多interface,继承了Executor,是Java中对tcp连接池定义的有一个多多 多接口,类图如下:

    ExecutorService接口中常用辦法 如下

void execute(Runnable command);    // 从Executor继承而来,用来执行Runnale,只有

返回值
<T> Future<T> submit(Callable<T> task);    // 执行Callable类型的task,并返回Future
<T> Future<T> submit(Runnable task, T result);    // 你这个

辦法

很少使用
Future<?> submit(Runnable task);    // 执行Runnable类型的task,并返回Future

    当然还有invokeAll、invokeAny,感兴趣的都可否否去看下。关于Future,下面会讲到。

    当我们都都 使用完成ExecutorService事先应该关闭它,因此它中间的tcp连接会突然地处运行状态,是原应应用无法停止。关闭ExecutorService的辦法 有两种,其一是ExecutorService.shutdown()辦法 ,在调用shutdown()辦法 事先,ExecutorService不不立即关闭,因此它不再接收新的任务,直到当前所有tcp连接执行完成才会关闭,所有在shutdown()执行事先提交的任务全部都是被执行;其二是调用ExecutorService.shutdownNow()辦法 ,它将跳过所有正在执行的任务和被提交还只有 执行的任务,因此它并非对正在执行的任务做任何保证,有机会它们全部都是停止,全部都是机会执行完成。一般推荐的关闭辦法 是ExecutorService.shutdown()。

  Future

    对具体的Runnable机会Callable任务的执行结果进行退还、查询不是 完成、获取结果。必要时都可否否通过get辦法 获取执行结果,该辦法 会阻塞直到任务返回结果。相关类图如下

    从如上代码都可否否看出Future提供了两种功能:

      1、判断任务不是 完成;2、中断任务;3、获取任务执行结果。

tcp连接池使用示例

  Runnable使用示例

    示例一,定时周期的执行某个任务

    示例二,单tcp连接化的tcp连接池执行某个任务,并显示的关闭tcp连接池

  Callable使用示例

    示例一,Callable + Future获取结果;采用缓存tcp连接池执行任务

    示例二,Callable + FutureTask获取结果;采用定长tcp连接池执行定时任务

shiro中session验证定时任务

  shiro源码篇 - shiro的session的查询、刷新、过期与删除,你值得拥有中讲到了session验证定时任务,我们都都 AbstractValidatingSessionManager中createSession辦法 结束了了

  都可否否看了,调用Executors.newSingleThreadScheduledExcutor(ThreadFactory threadFactory)辦法 创建了有一个多多 多支持定时及周期性执行的单tcp连接化tcp连接池,支持定时及周期性地执行task,因此tcp连接池中只有一个多多 多多tcp连接。ExecutorServiceSessionValidationScheduler两种假如有一天有一个多多 多Runnable,只有 会定时、周期性的执行其run()。说的简单点假如有一天:应用启动300分钟后,单tcp连接化的tcp连接池中的单个tcp连接结束了了执行ExecutorServiceSessionValidationScheduler的run()辦法 ,事先每隔300分钟执行一次,300分钟是默认设置;ExecutorServiceSessionValidationScheduler的run()中,会调用sessionManager的validateSessions()辦法 完成session的验证。

总结

  1、不不返回结果,简单的tcp连接实现都可否否用Runnable(或Thread);需用返回结果的、稍简化的tcp连接实现都可否否用Callable;机会tcp连接操作频繁、需用连接池管理的都可否否考虑用ExecutorService来实现tcp连接池;更简化的任务调度,则都可否否用三方工具,比如:quartz,更多三方调度工具可查阅spring-boot-2.0.3之quartz集成,全部都是你想的那样哦!,具体选泽哪个,需用结合我们都都 的具体业务来考虑,只有 绝对的选泽谁而不选泽谁,看了谁更契合;

  2、一般状态下,Callable(或Runnale)、Executors、ExecutorService、Future会配合来使用,而是 事先我们都都 不需用返回值,则都可否否不关注Future;推荐使用tcp连接池的辦法 ,有与数据库连接池类似于的优点;

  3、而是 三方的框架、工具都沿用了jdk的tcp连接池实现,而只有 引用第三方调度工具,类似于shiro中,session的验证定时任务假如有一天沿用的jdk中的Executors.newSingleThreadScheduledExcutor(ThreadFactory threadFactory)来创建的tcp连接池;

  4、jdk中的tcp连接还有而是 内容,本文假如有一天涉及到了冰山一角,更深入的学习有待我们都都 自行去进行。

参考

  Java 8 教程汇总

  Java并发编程:Callable、Future和FutureTask

  深入理解 Java tcp连接池:ThreadPoolExecutor