大发快三_快三回血_大发快三回血

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

时间:2019-12-30 10:26:10 出处:大发快三_快三回血_大发快三回血

前言

  开心一刻

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

纯正的海豹突击队

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

  github:https://github.com/youzhibing

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

Runnable

  将会是简单的实现另另三个小任务管理器,大伙儿儿会通过实现Runnable接口或继承Thread类来完成。JDK1.0中就将会处于Runnable和Thread,Thread实现了Runnable接口。Runnable使用土土妙招一般如下

  一般大伙儿儿的任务管理器否是以匿名组织组织结构类的土土妙招处于的,就是 以如下土土妙招处于

  当然任务管理器的实现土土妙招还有Thread类,Thread实现了Runnable接口,本质还是一样;无论是Runnable,还是Thread,实现的任务管理器有另另三个小很明显的缺点,就是 只能返回值,执行完任务很久 无法获取执行结果。

Callable

  Callable接口是JDK1.5中引入的,和Runnable相似,否是用来实现多任务管理器,不同的是,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来完成的。

任务管理器池

  Executors

    也是JDK1.5新增内容,是创建ExecutorService、ScheduledExecutorService、ThreadFactory和Callable的工厂,并提供了或多或少有效的工具土土妙招。有就是 创建ExecutorService的土土妙招

    主要分为6类土土妙招,每一类都两两重载,另另三个小有ThreadFactory threadFactory参数,另另三个小只能ThreadFactory threadFactory参数,也就是 大伙儿儿能只能自定义ThreadFactory来定制Thread;若只能ThreadFactory参数,则使用默认的DefaultThreadFactory来构建Thread。6类土土妙招如下

      newCachedThreadPool(...)

        创建另另三个小可缓存的任务管理器池,将会任务管理器池长度超过处里都要能,可灵活回收空闲任务管理器,若无可回收,则新建任务管理器;返回类型是:ThreadPoolExecutor。

      newFixedThreadPool(...)

        创建另另三个小定长任务管理器池,可控制任务管理器最大并发数,超出的任务管理器会在队列中等候;返回类型是:ThreadPoolExecutor。

      newScheduledThreadPool(...)

        创建另另三个小定长任务管理器池,支持定时及周期性任务执行;返回类型是:ScheduledThreadPoolExecutor。多数请况下可用来替代Timer类。

      newSingleThreadExecutor(...)

        创建另另三个小单任务管理器化的任务管理器池,只能唯一的另另三个小工作任务管理器来执行任务,保证所有任务按照指定顺序执行;返回类型是:ThreadPoolExecutor的代理,大伙儿儿能只能认为就是 ThreadPoolExecutor。

      newSingleThreadScheduledExcutor(...)

        创建另另三个小单任务管理器化的任务管理器池,与newSingleThreadExecutor相似,但支持定时及周期性任务执行;返回类型是:ScheduledThreadPoolExecutor。

      newWorkStealingPool(...)

        创建持有足够任务管理器的任务管理器池来支持给定的并行级别,并通过使用多个队列,减少竞争;它都要能穿另另三个小并行级别的参数,将会不传,则被设定为默认的CPU数量。JDK1.8中新增,返回类型是:ForkJoinPool。ForkJoinFool通常配合ForkJoinTask的子类RecursiveAction或RecursiveTask使用。

    常用的主就是 以下3类:newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool。至于newWorkStealingPool,我还没用过,不太好评论。

  ExecutorService

    ExecutorService是另另三个小interface,继承了Executor,是Java中对任务管理器池定义的另另三个小接口,类图如下:

    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很久 应该关闭它,因此它里边的任务管理器会老要处于运行请况,是因为应用无法停止。关闭ExecutorService的土土妙招有本身,其一是ExecutorService.shutdown()土土妙招,在调用shutdown()土土妙招很久 ,ExecutorService不不立即关闭,因此它不再接收新的任务,直到当前所有任务管理器执行完成才会关闭,所有在shutdown()执行很久 提交的任务否是被执行;其二是调用ExecutorService.shutdownNow()土土妙招,它将跳过所有正在执行的任务和被提交还只能执行的任务,因此它何必 对正在执行的任务做任何保证,有将会它们否是停止,否是将会执行完成。一般推荐的关闭土土妙招是ExecutorService.shutdown()。

  Future

    对具体的Runnable将会Callable任务的执行结果进行撤除、查询否是完成、获取结果。必要时能只能通过get土土妙招获取执行结果,该土土妙招会阻塞直到任务返回结果。相关类图如下

    从如上代码能只能看出Future提供了本身功能:

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

任务管理器池使用示例

  Runnable使用示例

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

    示例二,单任务管理器化的任务管理器池执行某个任务,并显示的关闭任务管理器池

  Callable使用示例

    示例一,Callable + Future获取结果;采用缓存任务管理器池执行任务

    示例二,Callable + FutureTask获取结果;采用定长任务管理器池执行定时任务

shiro中session验证定时任务

  shiro源码篇 - shiro的session的查询、刷新、过期与删除,你值得拥有中讲到了session验证定时任务,大伙儿儿AbstractValidatingSessionManager中createSession土土妙招开始

  能只能看完,调用Executors.newSingleThreadScheduledExcutor(ThreadFactory threadFactory)土土妙招创建了另另三个小支持定时及周期性执行的单任务管理器化任务管理器池,支持定时及周期性地执行task,因此任务管理器池中只能另另三个小任务管理器。ExecutorServiceSessionValidationScheduler本身就是 另另三个小Runnable,只能会定时、周期性的执行其run()。说的简单点就是 :应用启动100分钟后,单任务管理器化的任务管理器池中的单个任务管理器开始执行ExecutorServiceSessionValidationScheduler的run()土土妙招,很久 每隔100分钟执行一次,100分钟是默认设置;ExecutorServiceSessionValidationScheduler的run()中,会调用sessionManager的validateSessions()土土妙招完成session的验证。

总结

  1、不不返回结果,简单的任务管理器实现能只能用Runnable(或Thread);都要能返回结果的、稍错综复杂的任务管理器实现能只能用Callable;将会任务管理器操作频繁、都要能连接池管理的能只能考虑用ExecutorService来实现任务管理器池;更错综复杂的任务调度,则能只能用三方工具,比如:quartz,更多三方调度工具可查阅spring-boot-2.0.3之quartz集成,全那个她 想的那样哦!,具体选折 哪个,都要能结合大伙儿儿的具体业务来考虑,只能绝对的选折 谁而不选折 谁,看完谁更契合;

  2、一般请况下,Callable(或Runnale)、Executors、ExecutorService、Future会配合来使用,就是 很久 大伙儿儿只能返回值,则能只能不关注Future;推荐使用任务管理器池的土土妙招,有与数据库连接池相似的优点;

  3、就是 三方的框架、工具都沿用了jdk的任务管理器池实现,而只能引用第三方调度工具,相似shiro中,session的验证定时任务就是 沿用的jdk中的Executors.newSingleThreadScheduledExcutor(ThreadFactory threadFactory)来创建的任务管理器池;

  4、jdk中的任务管理器还有就是 内容,本文就是 涉及到了冰山一角,更深入的学习有待大伙儿儿自行去进行。

参考

  Java 8 教程汇总

  Java并发编程:Callable、Future和FutureTask

  深入理解 Java 任务管理器池:ThreadPoolExecutor

热门

热门标签