Java 并发 - 是否有反向 CountDownLatch?
Java concurrency - is there a reverse CountDownLatch?
有一些用户激活的长 运行 任务在后台执行。由于该系统是多用户系统,因此要知道在任何给定时间可能有多少 运行 是不切实际的。
通常情况下,这些任务可以在后台执行,并在完成时简单地完成。某些有限的用户操作需要在继续之前完成所有此类任务。需要一个阻塞同步机制。我实现了这样做的逻辑,但意识到我需要的行为实际上与 CountDownLatch 相反:
当允许的任务(在我的例子中是后台任务)执行时,它会增加无界(或有界)计数
完成后它会减少计数
会有一些阻塞方法只在计数 > 0 时才阻塞
我发现 java.util.concurrent 中没有这样的 class。有谁知道这样的东西是否存在于任何地方?
如果有人想知道我最后做了什么,请在此处记录:
我最终需要两把锁:
this.workInProgressLock = new ReentrantReadWriteLock(true);
this.singleFileLock = new Semaphore(1, true);
ReadWriteLock 的工作原理主要与上面的评论中所述相同。主要问题是 writeLock
请求在待处理时被优先考虑。因此排序并不像它应该的那样容易控制。
信号量确实向上计数,但根据我的需要反向工作。为什么我加了一个?我很快意识到后台处理(任务)是一条两条路!如最初所述,后台进程可以在需要时启动。当运行在某些'critical sections'的应用中,出现了重大问题。因此,App 端需要一种方法来 'lock-out' 后台任务。单计数信号量非常适合该目的。
在某处(番石榴,无论何时何地)有一个 "BackgroundProcessingLock" 就好了:
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);
}
您可以使用 AtomicInteger
并使用 synchronized
和 Java 的内置 wait()
/ notify()
构造等待其锁定。
有一些用户激活的长 运行 任务在后台执行。由于该系统是多用户系统,因此要知道在任何给定时间可能有多少 运行 是不切实际的。
通常情况下,这些任务可以在后台执行,并在完成时简单地完成。某些有限的用户操作需要在继续之前完成所有此类任务。需要一个阻塞同步机制。我实现了这样做的逻辑,但意识到我需要的行为实际上与 CountDownLatch 相反:
当允许的任务(在我的例子中是后台任务)执行时,它会增加无界(或有界)计数
完成后它会减少计数
会有一些阻塞方法只在计数 > 0 时才阻塞
我发现 java.util.concurrent 中没有这样的 class。有谁知道这样的东西是否存在于任何地方?
如果有人想知道我最后做了什么,请在此处记录:
我最终需要两把锁:
this.workInProgressLock = new ReentrantReadWriteLock(true);
this.singleFileLock = new Semaphore(1, true);
ReadWriteLock 的工作原理主要与上面的评论中所述相同。主要问题是 writeLock
请求在待处理时被优先考虑。因此排序并不像它应该的那样容易控制。
信号量确实向上计数,但根据我的需要反向工作。为什么我加了一个?我很快意识到后台处理(任务)是一条两条路!如最初所述,后台进程可以在需要时启动。当运行在某些'critical sections'的应用中,出现了重大问题。因此,App 端需要一种方法来 'lock-out' 后台任务。单计数信号量非常适合该目的。
在某处(番石榴,无论何时何地)有一个 "BackgroundProcessingLock" 就好了:
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);
}
您可以使用 AtomicInteger
并使用 synchronized
和 Java 的内置 wait()
/ notify()
构造等待其锁定。