零基础java自学流程-Java语言高级446

2022/1/25 17:04:40

本文主要是介绍零基础java自学流程-Java语言高级446,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

4.3 join方法的实现原理

ForkJoinTask的join方法实现原理

Join方法的主要作用是阻塞当前线程等待获取结果。让我们一起看看ForkJoinTask的join方法的实现,代码如下:

public final V join() {
    int s;
    if ((s = doJoin() & DONE_MASK) != NORMAL)
        reportException(s);
    return getRawResult();
}

它首先调用doJoin方法,通过doJoin()方法得到当前任务的状态来判断返回什么结果,任务状态有4种:

  • 已完成(NORMAL):直接返回任务结果;
  • 被取消(CANCELLED):直接抛出CancellationException;
  • 信号(SIGNAL)
  • 出现异常(EXCEPTIONAL):直接抛出对应的异常

让我们分析一下doJoin方法的实现:

private int doJoin() {
    int s; Thread t; ForkJoinWorkerThread wt; ForkJoinPool.WorkQueue w;
    return (s = status) < 0 ? s :
        ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread) ?
        (w = (wt = (ForkJoinWorkerThread)t).workQueue).
        tryUnpush(this) && (s = doExec()) < 0 ? s :
        wt.pool.awaitJoin(w, this, 0L) :
        externalAwaitDone();
}


final int doExec() {
    int s; boolean completed;
    if ((s = status) >= 0) {
        try {
            completed = exec();
        } catch (Throwable rex) {
            return setExceptionalCompletion(rex);
        }
        if (completed)
            s = setCompletion(NORMAL);
    }
    return s;
}

在doJoin()方法里,首先通过查看任务的状态,看任务是否已经执行完成,

  • 如果执行完成,则直接返回任务状态;
  • 如果没有执行完,则从任务数组里取出任务并执行;
  • 如果任务顺利执行完成,则设置任务状态为NORMAL;
  • 如果出现异常,则记录异常,并将任务状态设置为EXCEPTIONAL。

    尚学堂给同学们带来全新的Java300集课程啦!java零基础小白自学Java必备优质教程_手把手图解学习Java,让学习成为一种享受_哔哩哔哩_bilibili尚学堂给同学们带来全新的Java300集课程啦本课程为Java300集2022版第一季,配合最新版的Java课程,所有视频重新录制,课件所有图形做了重新绘制和配色,图解学习Java,让学习成为一种享受本套教程专门为零基础学员而制,适合准备入行Java开发的零基础学员,视频中穿插多个实战项目。每一个知识点都讲解的通俗易懂,由浅入深。不仅适用于零基础的初学者,有经验的程序员也可做巩固学习。后续课https://www.bilibili.com/video/BV1qL411u7eE?spm_id_from=333.999.0.0

     



这篇关于零基础java自学流程-Java语言高级446的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程