3分时时彩官网_3分时时彩平台哪个好_玩3分时时彩的网站

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

时间:2019-11-19 18:06:12 出处:3分时时彩官网_3分时时彩平台哪个好_玩3分时时彩的网站

前言

  开心一刻

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

纯正的海豹突击队

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

  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()。说的简单点这麼多这麼多:应用启动1000分钟后,单多线程 池化的多线程 池池中的单个多线程 池开始英语 执行ExecutorServiceSessionValidationScheduler的run()妙招,以前每隔1000分钟执行一次,1000分钟是默认设置;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

热门

热门标签