当前位置: 首页 > 面试题库 >

灵活的CountDownLatch?

姚浩歌
2023-03-14
问题内容

我现在两次遇到问题,生产者线程会产生N个工作项,将它们提交给an ExecutorService,然后需要等待,直到所有N个项都已处理完毕。

注意事项

  • N事先未知 。如果是这样,我将简单地创建一个CountDownLatch然后具有生产者线程,await()直到完成所有工作。
  • 使用a CompletionService是不合适的,因为尽管我的生产者线程需要阻塞(即,通过调用take()),但 无法表示所有工作都已完成 ,从而导致生产者线程停止等待。

我当前喜欢的解决方案是使用整数计数器,并在提交工作项时将其 递增 ,而在处理工作项时将其 递减
。提交所有N个任务之后,我的生产者线程将需要等待锁,检查是否counter == 0每当收到通知时。消费者线程将需要通知生产者,如果它已减少计数器且新值为0。

有没有更好的方法来解决这个问题,或者java.util.concurrent我应该使用合适的结构而不是“自己动手”?

提前致谢。


问题答案:

java.util.concurrent.Phaser看起来对您来说效果很好。它计划以Java
7发行,但是最稳定的版本可以在jsr166的兴趣小组网站上找到。

移相器是美化的循环屏障。您可以注册N个参与方,当您准备好在特定阶段等待其参加时。

关于它如何工作的简单示例:

final Phaser phaser = new Phaser();

public Runnable getRunnable(){
    return new Runnable(){
        public void run(){
            ..do stuff...
            phaser.arriveAndDeregister();
        }
    };
}
public void doWork(){
    phaser.register();//register self
    for(int i=0 ; i < N; i++){
        phaser.register(); // register this task prior to execution 
        executor.submit( getRunnable());
    }
    phaser.arriveAndAwaitAdvance();
}


 类似资料:
  • flex-basis 我们使用flex-basis属性在分配空间之前定义flex-item的默认大小。 以下示例演示了flex-basis属性的用法。 在这里,我们创建了3个彩色盒子,并将它们的尺寸固定为150像素。 <!doctype html> <html lang = "en"> <style> .box{ font-size:15px;

  • 我有时觉得Flex太复杂了。 演示:https://jsfiddle.net/304xhguw/ 我试图创建一个容器,它的末尾有多行文本: 使用Flex应该很容易,对吧? 完成后,容器使用flex,在末尾对齐项,并且h1由于的和而创建新行。完美。 不是真的: 等等,刚才发生了什么事<代码> 不用担心,有一些惊人的特性应该可以工作,让我们试试:

  • 我有一个应用程序屏幕,顶部有一个标题,底部有几个按钮,中心的其余部分有一个输入表单。 我试图实现的目标是:我希望输入表单子项(即不同的输入字段)在垂直轴上展开,以填充可用空间。当键盘打开并占据40%的屏幕时,我希望输入字段之间的所有灵活空间都缩小,如果这不足以显示所有内容,我希望“中心”部分是可滚动的,这样用户就可以找到其余的输入字段,现在隐藏在“下面”。 我使用的是与子列

  • 本文向大家介绍javascript中活灵活现的Array对象详解,包括了javascript中活灵活现的Array对象详解的使用技巧和注意事项,需要的朋友参考一下 前言 JavaScript中的Array对象,就是我们常说的数组对象,主要用于封装多个任意类型的数据,并对它们进行管理。 所有主流浏览器均支持Array对象。 大家都知道Array实例有这四个方法:push、pop、shift、unsh

  • 我对灵活的查询有问题。这是我的疑问: 这是我执行时的错误: 有人能帮我吗?谢谢。

  • 我已经使用了< code >扩展的和< code >灵活的小部件,它们看起来工作起来是一样的。 扩展和灵活有什么区别?