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

  • 时间:
  • 浏览:0

前言

  开心一刻

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

纯正的海豹突击队

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

  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()。说的简单点可是我我:应用启动200分钟后,单应用程序化的应用程序池中的单个应用程序结束英文执行ExecutorServiceSessionValidationScheduler的run()土办法,但是每隔200分钟执行一次,200分钟是默认设置;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