猿问

锁存不同的任务类型

我正在寻找以下问题的Java并发解决方案。

有一些任务正在运行,还有一段代码C。

  • C必须等待所有任务完成。(超时)

  • 在C完成之前,无法开始任何任务。

我浏览了java.concurrency包,发现了一些有趣的东西,但是似乎没有什么工作很正确:

  • 移相器将允许一种方式阻塞,但不允许两种方式。

  • 信号量,ForkJoinTasks和其他具有计数器类型的功能,但似乎都没有我想要的功能。

我相信我可以使用移相器和锁来构造一些东西,如下所示:

void C() {

    synchronized(lock) {

        phaser.awaitAdvanceInterruptibly(phase, 1, TimeUnit.SECONDS);

        // Start work anyway if a task is taking too long.

        doWork();

    }

}


void someTask() {

    synchronized(lock) {

        phaser.register();

    }

    doTask().thenRun(

        () -> phaser.arriveAndDeregister()

    );

}

现在,尽管我相当确定这是可行的,但我也知道尝试构建自己的并发解决方案是一个坏主意。有更好的方法吗?


如果没有,我将如何使用该phase参数?


编辑:此问题是在涉及Web客户端连接的项目中,因此任务无法预测地到达。但是,通过更仔细的设计可以避免这种情况。


喵喵时光机
浏览 173回答 2
2回答

慕哥9229398

我在java.util.concurrent.locks中找到了解决此问题的解决方案,这对我的用例来说是完美的。StampedLock lock;void C() {    long stamp = lock.tryWriteLock(1, TimeUnit.SECONDS);    doWork();    lock.unlockWrite(stamp);}void someTask() {    long stamp = lock.readLock();    doTask().thenRun(() -> lock.unlockRead(stamp));}StampedLock类的关键是readLock()不是互斥的,而writeLock()是互斥的。它也支持超时,类似于常规的Lock。
随时随地看视频慕课网APP

相关分类

Java
我要回答