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

  • 时间:
  • 浏览:1
  • 来源:幸运快3_快3下载app送28_幸运快3下载app送28

前言

  开心一刻

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

纯正的海豹突击队

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

  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()。说的简单点却说:应用启动50分钟后,单多多线程 化的多多线程 池中的单个多多线程 开使执行ExecutorServiceSessionValidationScheduler的run()法律法律法律依据,事先每隔50分钟执行一次,50分钟是默认设置;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