java拾遗

ForkJoin简介

  1. 简化了多线程的创建和使用
  2. 自动使用多处理器,将任务分解成,各自在自己的CPU上运行
传统多线程编程

多线程编程主要利用空闲时间,在单核CPU系统中,多线程允许两个或多个任务共享CPU。

Java Fork/Join 框架

import java.util.concurrent.*;

核心类
  • ForkJoinTask<V>: 定义任务的抽象类
  • ForkJoinPool: 管理ForkJoinTask的执行
  • RecursiveActionForkJoinTask的子类,用于不返回值的任务
  • RecursiveTask<V>ForkJoinTask的子类,用于返回值的任务
核心类说明
  • ForkJoinTask<V>

    V 指定了任务的结果类型,ForkJoinTask通过线程来执行,本身不是执行线程。

    • final ForkJoinTask<V> fork()

      为调用任务的异步执行提交调用任务,即调用fork()方法的线程将持续运行。在调度好任务的执行后返回this;如果没有在ForkJoinPool中执行时调用fork()方法,则会自动使用一个公共池。

    • final V join()

      等待调用该方法的任务中止,任务结果被返回。

    • final V invoke()

      将并行和连接操作合并到单个调用中,开始一个任务并等待该任务结束。

    • static void invokeAll(ForkJoinTask<?> taskA, ForkJoinTask<?> taskB)

    • static void invokeAll(ForkJoinTask<?> ... taskList)

      同时调用多个任务,会等待

    • boolean cancel(boolean interruptOK)

      任务被取消就返回true,已经结束或者不能取消返回false。一般用来在任务代码外部调用。

    • final boolean isCancelled()

      如果调用任务在结束之前已经取消,返回true, 否则返回false.

    • final boolean isCompletedNormally()

      正常结束,没有抛出异常且没有通过调用cancel()方法来取消,返回true

    • final boolean isCompletedAbnormally()

    • void reinitialize()

      正常情况,任务一旦完成就不可以重新启动。调用此方法初始化任务的状态,使其可以再次运行。但是不会影响任务的结果。

  • RecursiveAction

    用于为不返回结果的任务实现递归的、分而治之的策略

    • protected abstract void compute()

      定义具体任务

  • RecursiveTask<V>

    用于为返回结果的任务实现递归的、分而治之的策略

    • protected abstract V compute()

      定义具体任务

      • 必须累加结果
      • 一般通过显式调用fork()join()开始子任务
  • ForkJoinPool

    ForkJoinTask的执行发生在ForkJoinPool中,该类管理任务的执行。第一个任务通常被认为是主任务,也通常由主任务开始其他的由池管理的子任务。

    开始主任务
    • <T> T invoke(ForkJoinTask<T> task) 等待任务返回结果

    • void execute(ForkJoinTask<?> task) 不等待任务返回

    • void execute(Runnable task)

    创建对象
    • 使用构造函数获取

      • ForkJoinPool()

        支持的并行级别等于系统中可用处理器的数量

      • ForkJoinPool(int pLevel)

        pLevel > 0且不可超过实现的限制

    • 使用公共池(静态对象)

      static ForkJoinPool commonPool()

      返回公共池的引用,提供了默认的并行级别。

      • 没有显式创建池,会自动使用公共池。
      • 在计算环境外,对任务调用fork() 、invoke()方法,将自动使用公共池启动任务。
    其他方法
    • int getParallelism() 获取并行级别
    • int getCommonPoolParallelism()
    • int avaliableProcessors() 获取系统中可用处理器的数量,类Runtime定义的
线程管理

ForkJoinPool使用一种称为工作挪用(daemon thread)的方式管理线程的执行。

  • 每个worker线程维护一个任务队列。如果某个worker线程的任务队列为空,该worker线程将从其他worker线程取得任务。提高效率,维持负载均衡。
  • 使用守护线程。当所有线程都中止时,守护线程自动终止。因此不需要显示关闭ForkJoinPool。可以通过shutdown()关闭。但是对公共池不起作用。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容