栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

执行程序:如果递归创建任务,如何同步等待所有任务完成?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

执行程序:如果递归创建任务,如何同步等待所有任务完成?

非常感谢您的所有建议!

最后,我选择了一些我认为相当简单的东西。我发现CountDownLatch几乎是我所需要的。它一直阻塞直到计数器达到0。唯一的问题是它只能递减计数,不能递减计数,因此不能在我有任务可以提交新任务的动态设置中使用。因此,我实现了一个

CountLatch
提供附加功能的新类。(请参阅下文)然后,按如下方式使用此类。

主线程调用

latch.awaitZero()
,直到锁存器到达0为止。

任何线程,在调用

executor.execute(..)
calls 之前
latch.increment()

在完成之前,任何任务都会调用

latch.decrement()

当最后一个任务终止时,计数器将达到0,从而释放主线程。

欢迎进一步的建议和反馈!

public class CountLatch {@SuppressWarnings("serial")private static final class Sync extends AbstractQueuedSynchronizer {    Sync(int count) {        setState(count);    }    int getCount() {        return getState();    }    protected int tryAcquireShared(int acquires) {        return (getState() == 0) ? 1 : -1;    }    protected int acquireNonBlocking(int acquires) {        // increment count        for (;;) { int c = getState(); int nextc = c + 1; if (compareAndSetState(c, nextc))     return 1;        }    }    protected boolean tryReleaseShared(int releases) {        // Decrement count; signal when transition to zero        for (;;) { int c = getState(); if (c == 0)     return false; int nextc = c - 1; if (compareAndSetState(c, nextc))     return nextc == 0;        }    }}private final Sync sync;public CountLatch(int count) {    this.sync = new Sync(count);}public void awaitZero() throws InterruptedException {    sync.acquireSharedInterruptibly(1);}public boolean awaitZero(long timeout, TimeUnit unit) throws InterruptedException {    return sync.tryAcquireSharedNanos(1, unit.tonanos(timeout));}public void increment() {    sync.acquireNonBlocking(1);}public void decrement() {    sync.releaseShared(1);}public String toString() {    return super.toString() + "[Count = " + sync.getCount() + "]";}}

请注意,可以将

increment()
/
decrement()
调用封装到自定义的
Executor
子类中,如Sami Korhonen
所建议的那样,或者与
beforeExecute
afterExecute
一起由impl所建议的那样。看这里:

public class CountingThreadPoolExecutor extends ThreadPoolExecutor {protected final CountLatch numRunningTasks = new CountLatch(0);public CountingThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,        BlockingQueue<Runnable> workQueue) {    super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);}@Overridepublic void execute(Runnable command) {    numRunningTasks.increment();    super.execute(command);}@Overrideprotected void afterExecute(Runnable r, Throwable t) {    numRunningTasks.decrement();    super.afterExecute(r, t);}public void awaitCompletion() throws InterruptedException {    numRunningTasks.awaitZero();}public void awaitCompletion(long timeout, TimeUnit unit) throws InterruptedException {    numRunningTasks.awaitZero(timeout, unit);}}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/404378.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号