Java并发 - 是否有反向的CountDownLatch?

时间:2017-05-10 15:27:20

标签: java java.util.concurrent

有一些用户激活的长时间运行的任务在后台执行。由于系统是多用户的,因此了解在任何给定时间可能运行的数量是不切实际的。

通常,这些任务可以在后台执行,并在完成后完成。某些有限的用户操作需要在继续之前完成所有此类任务。需要阻塞同步机制。我实现了这样做的逻辑,但意识到我需要的行为实际上与CountDownLatch相反:

  • 当一个允许的任务(在我的情况下,一个后台任务)执行时,它会增加计数无限制(或有界)

  • 完成后会减少计数

  • 会有阻塞方法只在计数时阻止> 0

我发现java.util.concurrent中没有这样的类。有谁知道这样的东西是否存在于任何地方?

2 个答案:

答案 0 :(得分:0)

如果有人想知道我最后做了什么,请记录下来:

我最终需要两个锁:

    this.workInProgressLock = new ReentrantReadWriteLock(true);
    this.singleFileLock = new Semaphore(1, true);

ReadWriteLock主要按照上面的评论中的描述工作。主要问题是writeLock请求在它们挂起时被优先考虑。因此,排序并不像应该的那样容易控制。

信号量确实计数,但我需要的是相反的。我为什么要加一个?我很快意识到后台处理(任务)是一条双向的街道!如最初描述的那样,允许后台进程在需要时启动。在应用程序的某些“关键部分”运行时,出现了重大问题。因此,App端需要一种“锁定”后台任务的方法。单计数信号量非常适合这个目的。

在某个地方有一个“BackgroundProcessingLock”会很好(Guava,在哪里):

public interface BackgroundProcessingLock {

    void allowBackgroundTasks();

    void preventBackgroundsTasks(boolean wait);  

    void wait();  // simply waits until all background tasks complete

    void startBackgroundTask();

    void completeBackgroundTask();

    void setMaxNumberOfBackgroundTasks(int maxParallelBackgroundTasks);

}  

答案 1 :(得分:0)

您可以使用AtomicInteger并使用synchronized和Java的内置wait() / notify()结构来等待其锁定。