Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一个完全无阻塞的参与者模型?_Java_Multithreading_Nonblocking - Fatal编程技术网

Java 一个完全无阻塞的参与者模型?

Java 一个完全无阻塞的参与者模型?,java,multithreading,nonblocking,Java,Multithreading,Nonblocking,所以最近我在看我的演员模型。我的任务需要在每个队列上连续执行,即1个任务只能在所有提交的任务完成之前开始执行;并且在单个队列上不允许并行 其中大多数使用标准JDK中的ThreadPoolExecutor、SingleThreadExecutor等实用程序。然而,在深入研究这些执行者时,我认为在检查退出条件时不可避免地会使用ReentrantLock,即如果这是添加的第一个任务,并且需要启动作业;如果这是最后一个正在运行的任务,并且调度可以暂停一点 我试图通过使用所有非阻塞(即compareAnd

所以最近我在看我的演员模型。我的任务需要在每个队列上连续执行,即1个任务只能在所有提交的任务完成之前开始执行;并且在单个队列上不允许并行

其中大多数使用标准JDK中的ThreadPoolExecutor、SingleThreadExecutor等实用程序。然而,在深入研究这些执行者时,我认为在检查退出条件时不可避免地会使用ReentrantLock,即如果这是添加的第一个任务,并且需要启动作业;如果这是最后一个正在运行的任务,并且调度可以暂停一点

我试图通过使用所有非阻塞(即compareAndSet())来实现这一部分,但所有尝试都失败了。我还试图在网上寻找其他实现,但它们似乎都至少包含一个锁


所以我的问题是,是否真的可以实现这样一个参与者模型,只使用非阻塞和比较数据集相关的操作?如果是,怎么做?

我想你在这里做工程太过分了。是的,一个纯粹的参与者模型是可能的,但是实现它所需的工作非常糟糕(至少在Java中是如此)

如果您使用一个执行器,并为发生的每个事件创建一个新的可运行线程,然后将其分发给执行器,那么如果这些线程需要在空闲时间暂停,您将对它们进行一些阻塞,但这不是一个问题,实际上是一件好事

另一种方法是在每次需要时重新创建线程,这比简单地搁置现有线程要昂贵得多。不管怎样,阻塞时间只是从空闲时间中减去的——没有负面影响——因为如果有进一步的工作要做,每个线程将立即继续而不阻塞

执行器线程如何工作的伪代码:

while (this.isInterrupted() == false) {
  while (taskList.hasMore()) {
    process(taskList.next());
  }
  taskList.waitForTasks();
}

是否有一个客户端正在等待所有任务的完成?也就是说,即使没有作业,一个工作线程也不应该阻塞并仍然持有一个处理器?为什么?如果没有工作要做,你不应该通过循环来弥补更多,通过避免阻塞线程间通信来消耗CPU和内存带宽。也许我没有清楚地描述它。当没有可用的任务时,线程本质上应该执行wait()或等效任务;但是放入队列的第一个任务应该是yield()或等效任务。现在这里是wait()和yield(),它基本上需要一个synchronized()块来检查是否没有更多任务,线程是否正在运行。我想不出一个办法来避免这种情况。