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

  • 时间:
  • 浏览:1
  • 来源:大发快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()。说的简单点要我:应用启动400分钟后,单程序运行运行化的程序运行运行池中的单个程序运行运行时候开始执行ExecutorServiceSessionValidationScheduler的run()土法律依据 ,时候每隔400分钟执行一次,400分钟是默认设置;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