所以最近我正在寻找我的演员模特。我的任务需要在每个队列上连续执行,即1个任务只能在完成之前提交的所有任务之后开始执行;并且在单个队列中不允许并行。
他们中的大多数使用标准JDK中的ThreadPoolExecutor,SingleThreadExecutor等实用程序。但是,在进一步研究那些执行者时,我认为在检查退出条件时不可避免地会使用ReentrantLock,即如果这是第一个添加的任务而且需要启动工作;如果这是最后一个正在运行的任务,并且调度可以暂停一点。
我试图通过使用所有非阻塞即compareAndSet()来实现此部分,但我的所有尝试都失败了。我也尝试在线寻找其他实现,但似乎它们都包含至少1个锁。
所以我的问题是,实际上是否有可能只使用非阻塞和compareAndSet相关的操作来实现这样的actor模型?如果是,怎么样?
答案 0 :(得分:0)
我认为你在这里过度工程。是的,纯粹的演员模型是可能的,但实现它的必要工作是非常糟糕的(至少在Java中)。
如果您使用Executor并为发生的每个事件创建一个新的Runnable,然后将其分发给Executor,那么如果需要在空闲时间保持这些线程,那么您将对这些线程进行一些阻止,但是这样这不是问题,实际上是一件好事。
另一种方法是在每次需要时重新创建线程,这比简单地保持现有线程更昂贵。而且阻塞时间无论如何只能从空闲时间中减去 - 没有任何缺点 - 因为如果还有其他工作要做,每个线程将立即继续而不会阻塞。
执行程序线程如何工作的伪代码:
while (this.isInterrupted() == false) {
while (taskList.hasMore()) {
process(taskList.next());
}
taskList.waitForTasks();
}