首页 欧洲联赛 正文

Java fork/join同时框架的详细信息-betway官网_betway必威手机版_betway必威体育

原文: https://www.cnblogs.com/senlinyang/p/7885964.html

Fork/Join结构是Java 7供给的一个用于并行履行使命的结构,是一个把大使命切割成若干个小使命,终究汇总每个小使命成果后得到大使命成果的结构。Fork/Join结构要完结两件作业:

1.使命切割:首要Fork/Join结构需求把大的使命切割成满足小的子使命,假如子使命比较大的话还要对子使命进行持续切割

2.履行使命并兼并成果:切割的子使命别离放到双端行列里,然后几个发动线程别离从双端行列里获取使命履行。子使命履行完的成果都放在别的一个行列里,发动一个线程从行列里取数据,然后兼并这些数据。

在Java的Fork/Join结构中,运用两个类完结上述操作

1.ForkJoinTask:咱们要运用Fork/Join结构,首要需求创立一个ForkJoin使命。该类供给了在使命中履行fork和join的机制。通常情况下咱们不需求直接集成ForkJoinTask类,只需求承继它的子类,Fork/Join结构供给了两个子类:

a.RecursiveAction:用于没有回来成果的使命

b.RecursiveTask:用于有回来成果的使命

2.ForkJoinPool:ForkJoinTask需求经过ForkJoinPool来履行

使命切割出的子使命会添加到当羊奶果前作业线程所保护的双端行列中,进入行列的头部。当一个作业线程的行列里暂时没有使命时,它会随机从其他作业线程的行列的尾部获取一个使命(作业盗取算法)。

Fork/Join结构的完结原理

ForkJoinPool由ForkJoinTask数组和ForkJoinWorkerThread数组组成,ForkJoinTask数组担任将寄存程序提交给ForkJoinPool,而ForkJoinWorkerThread担任履行这些使命。

ForkJoinTask的Fork办法的完结原理: 当咱们调用ForkJoinTask的fork办法时,程序会把使命放在ForkJoinWorkerThread的pushTask的w奔驰orkQueue中,异步地履行这个使命,然Java fork/join一同结构的详细信息-betway官网_betway必威手机版_betway必威体育后当即回来成果,代码如下:

public final ForkJoinTask fork() {
Thread t;
if ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread)
((ForkJoinWorkerThread)t).workQueue.push(this);
else
ForkJoinPool.common.externalPush(this);
return this;
}

pushTask办法把当时使命寄存在ForkJoinTask数组行列里。然后再调用ForkJoinPool的signalWork()办法唤醒或创立一个作业线程来履行使命。代码如下:

final vJava fork/join一同结构的详细信息-betway官网_betway必威手机版_betway必威体育oid push(ForkJoinTask
ForkJoinTask
int b = base, s = top, n;
if ((a = array) != null) { // ignore if queue removed
int m = a.length - 1; // fenced write for task visibility
U.putOrderedObject(a, ((m & s) << ASHIFT) + ABASE, task);
U文咏珊三级叫什么姓名.putOrderedInt(this, QTOP, s + 1);
if ((n = s - b) <= 1) {
if ((p = pool) != null)
p.signalWork(p.workQueues, this);
}
else if (n >= m)
growArray();
}
}

ForkJoinTask的join办法完结原理

Join办法的首要作用是堵塞当时线程并等候获取成果。让咱们一同看看For俄亥俄州立大学kJoinTask的join办法的完结,代码如下:

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

它首要调用doJoattentionin办法,经过doJoin()办法得到当时使命的状况来判别回来什么成果,使命状况有4种:已完结(NORMAL)、被撤销(CANCELLED)、信g5号(SIGNAL)和出现反常(EXCEPTIONAL)。

假如使命状况是已完结,则直接回来任笔记本吧务成果。

假如使命状况是被撤销,则直接抛出CancellationException

假如使命状况是抛出反常,则直接抛出对应的反常

让咱们剖析一下doJoin办法的完结

private int doJoin() {
int s; Thread t; ForkJoinWorkerThread wt; ForkJoinPool.WorkQueue w;
return (s = Java fork/join一同结构的详细信息-betway官网_betway必威手机版_betway必威体育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(NORM红楼之安全终身AL);
}
return s;
}

在doJ北三县oin()办法里,首要经过查看使命的状况,看使命是否现已履行完结,假如履行完结,则直接回来使命状况;假如没有履行完,则从使命数组里取出使命并履行。假如使命顺畅履行完结,则设置使命状况为NORMAL,假如出现反常,则记载反常,并将使命状况设置为EXCEPTIONAL。

Fork/Join结构的反常处理

ForkJoinTask在履行的时分可能会抛出反常,可是咱们没办法在主线程里直接捕获反常,所以ForkJoinTask供给了isCompletedAbnormally()办法来查看使命是否现已抛出反常或现已被撤销了,而且能够经过ForkJoinTask的getException办法获取反常。运用如下代码:

if(task.isCom星戒pletedAbnormally())
{
System.out.println(task.getException());
}

getException办法回来Throwable目标,假如使命被撤销了则回来CancellationException。假如使命没有完结或许没有抛出反常则回来null。

public final Throwable getExcep山东高速路况tion() {
int s = status & DONE_MASK;
return ((s >= NORMAL) ? null :
(s == CANCELLED) ? new CancellationException() :
getThrowableException());
}

运用比如: 咱们经过一个简略的比如来介绍一下Fork/Join结构的运用。需求是求1+2+3+4的成果

运用Fork/Join结构首要要考虑到的是怎么切割使命,假如期望每个子任sunshine务最多履行两个数的相加,那么咱们设置切割的阈值是2,由所以4个数字相加,所以Fork/Join结构会把这个使命fork成两个子使命,子使命一担任核算1+2,子使命二担任核算3+4,然后再join两个子使命的成果。由于是有成果的使命,所以有必要承继RecursiveTask,完结代码如下:

public class CountTask extends RecursiveTask{
private 糖醋丸子的家常做法static final int THREAD_HOLD = 2;
private int start;
private int end;
public CountTask(int start,int end){
this.start = start;
this.enJava fork/join一同结构的详细信息-betway官网_betway必威手机版_betway必威体育d = end;
}
@Override
protected Integer compute() {
int sum = 0;
//假如任手麻是怎么回事务满足小就核算
boolean canCompute = (end - start) <= THREAD_HOLD;
if(canCompute){
for(int i=start;i<=end;i++){
sum += i;
}
}else{
int middle = (start + end) / 2;
CountTaskJava fork/join一同结构的详细信息-betway官网_betway必威手机版_betway必威体育 left = new CountTask(start,middle);
CountTask right = new CountTask(middle+1,end);
//履行子使命
left.fork();
right.fork();
//获取子使命成果
int l够钟Result = left.join();
int rResult = right.join();
sum = lResult + rResult;
}
return sJava fork/join一同结构的详细信息-betway官网_betway必威手机版_betway必威体育um;
}
public static void main(String[] args){
ForkJoinPool pool = new ForkJoinPool();
CountTask task = new CountTask(1,4);
Future result = pool.submit(task);
tr美国神婆y {
System.out.println(result.get());
} catch (InterruptedException e) {
e.print集安StackTrace();
} catch (ExecutionException e) {
e.printStackJava fork/join一同结构的详细信息-betway官网_betway必威手机版_betway必威体育Trace();
}
}
}

经过这个比如,咱们进一步了解ForkJoinTask,ForkJoinTask与一般使命的首要差异在于它需求完结compute办法,在这个办法里,首要需求判别使命是否满足小,假如满足小就直接履行使命。假如不满足小,就有必要切割成两个子使命,每个子使命在调用fork办法时,又会进入compute办法,看看当时子使命是否需求持续切割成子使命,假如不需求持续切割,则履行当时子使命并回来成果。运用join方咱们立足于美利坚法会等候子使命履行完并得到其成果。

相关推荐

  • 暂无相关文章