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 执行者-需要LinkedBlockingQueue_Java_Multithreading_Java.util.concurrent - Fatal编程技术网

Java 执行者-需要LinkedBlockingQueue

Java 执行者-需要LinkedBlockingQueue,java,multithreading,java.util.concurrent,Java,Multithreading,Java.util.concurrent,当我们谈论使用Executors服务处理异步事件时,为什么创建一个新的固定线程池需要使用LinkedBlockingQueue?到达的事件根本不相关,所以为什么要使用队列,因为使用者线程仍然会涉及获取锁的争用?为什么Executors类没有一些混合数据结构(例如并发映射实现),在大多数情况下不需要take锁?线程池executor使用BlockingQueue有很好的理由(顺便说一句,您不必使用LinkedBlockingQueue实现,您可以使用BlockingQueue)。队列应处于阻塞状态

当我们谈论使用Executors服务处理异步事件时,为什么创建一个新的固定线程池需要使用LinkedBlockingQueue?到达的事件根本不相关,所以为什么要使用队列,因为使用者线程仍然会涉及获取锁的争用?为什么Executors类没有一些混合数据结构(例如并发映射实现),在大多数情况下不需要take锁?

线程池executor使用BlockingQueue有很好的理由(顺便说一句,您不必使用LinkedBlockingQueue实现,您可以使用
BlockingQueue
)。队列应处于阻塞状态,以便在没有要执行的任务时挂起工作线程。此阻塞是使用等待条件变量完成的,因此当队列为空时,等待的工作线程不会消耗任何CPU资源

如果在线程池中使用非阻塞队列,那么工作线程如何轮询要执行的任务?它们必须实现某种轮询,这是不必要的CPU资源浪费(这将是“忙等待”)

更新:

好的,现在我完全理解了这个用例。不管怎样,你仍然需要阻止收集。原因基本上是一样的——因为你实现了生产者-消费者,你应该有办法让工作线程等待消息到达——没有互斥+条件变量(或者简单地阻止队列),你就无法做到这一点

关于map-是的,我理解您想要如何使用它,但不幸的是没有提供这样的实现。最近我解决了类似的问题:我需要根据一些条件对传入任务进行分组,并连续执行每个组中的任务。因此,我实现了我自己的GroupThreadPoolExecutor,它可以进行此分组。其思想是imple:将传入任务分组到map中,然后在组中的上一个任务完成时将它们添加到执行器队列


有很大的讨论-我认为这与您的问题有关。

线程池执行器使用
阻塞队列
有很好的理由(顺便说一句,您没有义务使用LinkedBlockingQueue实现,您可以使用
阻塞队列
)。队列应处于阻塞状态,以便在没有要执行的任务时挂起工作线程。此阻塞是使用等待条件变量完成的,因此当队列为空时,等待的工作线程不会消耗任何CPU资源

如果在线程池中使用非阻塞队列,那么工作线程如何轮询要执行的任务?它们必须实现某种轮询,这是不必要的CPU资源浪费(这将是“忙等待”)

更新:

好的,现在我完全理解了这个用例。不管怎样,你仍然需要阻止收集。原因基本上是一样的——因为你实现了生产者-消费者,你应该有办法让工作线程等待消息到达——没有互斥+条件变量(或者简单地阻止队列),你就无法做到这一点

关于map-是的,我理解您想要如何使用它,但不幸的是没有提供这样的实现。最近我解决了类似的问题:我需要根据一些条件对传入任务进行分组,并连续执行每个组中的任务。因此,我实现了我自己的GroupThreadPoolExecutor,它可以进行此分组。其思想是imple:将传入任务分组到map中,然后在组中的上一个任务完成时将它们添加到执行器队列


有很大的讨论-我认为这与你的问题有关。

我认为这是因为三件事:a)它是一个阻塞的数据结构;b) 此队列类型是无限的;c) 先进先出顺序是有保证的。@AndrewLogvinov-您好,谢谢您的回答,问题不在于我们为什么有一种方法使用LBQ,而在于我们为什么没有另一种灵活的方法来代替LBQ,其中可以有一个实现map的混合DS?如果使用map,关键是什么,价值是什么?我认为这是因为三件事:a)它是一个阻塞数据结构;b) 此队列类型是无限的;c) 先进先出顺序是有保证的。@AndrewLogvinov-您好,谢谢您的回答,问题不在于我们为什么有一种方法使用LBQ,而在于我们为什么没有另一种灵活的方法来代替LBQ,其中可以有一个实现map的混合DS?如果使用map,什么是键,什么是值?@nogard-想象一下,有一个并发hashmap的cyz实现,在事件中,pk不是+1。假设第一个事件对象到达时的数字为5000,唯一标识符为1。第二个事件对象以数字10000到达,唯一标识符为1。现在基于散列,如果事件5000和事件10000可能存储在数组的不同部分。理想情况下,如果两个不同的线程在阵列的不同部分进行轮询,则不需要使用take锁!好的,谢谢你给我指出这个链接和你的答案。对任务进行分组看起来很好(尽管我还没有深入思考),但我不想最终陷入将特定组与特定线程耦合的情况。假设在一个契约“x”中,其事件1、2、3……等按顺序到达,我希望它们由三个线程并行处理,但按到达顺序交付给客户机。我希望对这些线程的输出进行排序,然后将它们放在最后一个队列中进行发送。@nogard-想象一下,有一个并发hashmap的cyz实现,其中在事件中出现的pk不是+1。假设第一个事件对象到达时的数字为5000,唯一标识符为1。第二个事件对象以数字10000到达,唯一标识符为1。现在基于事件5000的哈希