首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

多线程并发之CountDownLatch阻塞等待

总结来说,CountDownLatch的作用就是等待其他的线程都执行完任务,必要时可以对各个任务的执行结果进行汇总,然后主线程才继续往下执行。...0,则会唤醒所有等待在这个latch上的线程。...System.currentTimeMillis(); System.out.println("任务执行完成,耗时:" + (endTime - startTime) + "毫秒"); 结果...可以用在一些比较耗时长的任务上,例如调用第三方接口、业务线比较长,当超过指定时间后就当作失败处理,避免服务一直处于等待阻塞状态。 结果: 4....扩展 如果采用多线程异步任务Future,通过CompletableFuture.allOf也可以实现同样的效果,阻塞等待任务执行结果,参考文章多线程Future,CompletableFuture

78320

【多线程】等待唤醒机制和阻塞队列

System.out.println("wait前"); obj.wait(); System.out.println("wait后"); } } 结果抛出了一个异常...:非法的锁状态异常,也就是调用wait的时候,当前锁的状态是非法的 这是因为,在wait方法中,会先解锁然后再等待,所以要使用wait,就要先加个锁,阻塞等待就是把自己的锁释放掉再等待,不然一直拿着锁等待...,其他线程就没机会了 把wait操作写在synchronized方法里就可以了,运行之后main线程就一直等待中,在jconsole中看到的也是waiting的状态 注意:wait操作进行解锁和阻塞等待是同时执行的...释放锁并进入阻塞等待,准备接收唤醒通知 2....,有的话,厨师进行等待 sleep() 和 wait() 的区别: 这两个方法看起来都是让线程等待,但是是有本质区别的,使用wait的目的是为了提前唤醒,sleep就是固定时间的阻塞,不涉及唤醒,虽然之前说的

8310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Linux】深入 Linux 进程等待机制:阻塞与非阻塞的奥秘

    sleep(5); exit(257); } else { //father int status = 0; pid_t ret = waitpid(-1,&status,0);//阻塞等待...} else { printf("wait child failed,return\n"); return 1; } } return 0; } 执行过程: 因为阻塞等待的缘故...{ //father int status = 0; pid_t ret = 0; do { ret = waitpid(-1,&status,WNOHANG);//非阻塞等待...3.解释堵塞与非堵塞 阻塞场景:打电话等朋友接听 你拨打朋友的电话,直到朋友接通之前你什么都做不了。这就像阻塞调用,你必须等着事情完成。...非阻塞场景:发消息等待回复 你给朋友发了个消息,等他们回你。你不用一直盯着手机看,而是可以去做别的事情,等收到消息后再查看。这就像非阻塞调用,你不需要等着完成才能做其他事情。

    8810

    Java线程阻塞

    阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),学过操作系统的同学对它一 定已经很熟悉了。Java 提供了大量方法来支持阻塞,下面让我们逐一分析。   ...典型地,sleep() 被用在等待某个资源就绪的情形:测试发现条件不满足后,让线程阻塞一段时间后 重新测试,直到条件满足为止。   ...典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个 线程产生了结果后,调用 resume() 使其恢复。   ...遗憾的是,Java 并不在语言级别上支持死锁的避免,我们在编程中必须小 心地避免死锁。   ...以上我们对 Java 中实现线程阻塞的各种方法作了一番分析,我们重点分析了 wait() 和 notify() 方法,因为它们的功能最强大,使用也最灵活,但是这也导致了它们的效率较低,较容易出错。

    1.1K10

    Java阻塞队列

    什么是阻塞队列 原文地址为,转载请注明出处! 阻塞队列是一个支持阻塞的插入和移除的队列。 支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。...支持阻塞的移除方法:意思是队列为空时,获取元素(同时移除元素)的线程会被阻塞,等到队列变为非空。...一直阻塞:当阻塞队列满时,如果生产者线程往队列里面put元素,则生产者线程会被阻塞,知道队列不满或者响应中断退出。当队列为空时,如果消费者线程从队列里take元素。...阻塞队列 ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列 LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列 PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列...如果队列是空的,消费者会一直等待,当生产者添加元素时,消费者是如何知道当前队列有元素的呢?

    49920

    Java同步和异步,阻塞和非阻塞

    就是在发出一个调用时, 在没有得到结果之前, 该调用就不返回, 但是一旦调用返回, 就得到返回值了. 也就是由"调用者"主动等待这个"调用"的结果....阻塞和非阻塞属于进程API执行动作的方式, 关注的是程序在等待调用结果时的状态. 阻塞是指: 调用结果返回之前, 当前线程会被挂起. 函数只有在得到结果之后才会返回, 线程需要等待结果....非阻塞是指: 与阻塞的概念相对应, 指在不能立刻得到结果之前, 该函数不会阻塞当前线程, 而会立刻返回. 线程不需要等待结果....Java中的同步和异步 定义: 任务A, 任务B 同步: 任务A和任务B之间有关联, 例如任务B中途要给任务A一个数字, 那么任务A或许需要等待任务B生产这个数, 任务A需要等待任务B的这个动作叫做同步...下面给出Java代码的例子. 同步阻塞: int i = System.in.read(); 当命令终端没有输入时, 调用该方法的线程被阻塞 ,表现出和终端同步.

    5.5K31

    Java|网络IO之同步、异步、阻塞、非阻塞

    女友本想还和我一起逛街的,但是不知道饭能什么时候做好,只好和我一起在餐厅等,而不能去逛街,直到吃完饭才能去逛街,中间等待做饭的时间浪费掉了。这就是典型的阻塞。...对于网络IO来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的UDP包),这个时候内核就要等待足够的数据到来。而在用户进程这边,整个进程会被阻塞。...当内核一直等到数据准备好了,它就会将数据从内核中拷贝到用户内存,然后内核返回结果,用户进程才解除block的状态,重新运行起来。...从用户进程角度讲 ,它发起一个read操作后,并不需要等待,而是马上就得到了一个结果。用户进程判断结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。...简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞

    2.9K80

    Java并发编程:阻塞队列

    Java并发编程:阻塞队列   在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList)...本文先讲述一下java.util.concurrent包下提供主要的几种阻塞队列,然后分析了阻塞队列和非阻塞队列的中的各个方法,接着分析了阻塞队列的实现原理,最后给出了一个实际例子和几个使用场景。   ...请尊重作者劳动成果,转载请标明原文链接:    http://www.cnblogs.com/dolphin0520/p/3932906.html 一.几种主要的阻塞队列   自从Java 1.5之后,...在java.util.concurrent包下提供了若干个阻塞队列,主要有以下几个:   ArrayBlockingQueue:基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象时必须制定容量大小...参考资料:   《Java编程实战》 http://ifeve.com/java-blocking-queue/ http://endual.iteye.com/blog/1412212 http

    1K40

    Java集合--阻塞队列(引言)

    Java多线程编程中,生产者消费者模型,想必大家都在熟悉不过了,简单来说就是一部分线程负责向容器中生产,而另一部分线程负责从容器中获取。 在这个模型当中,Java主要利用队列的数据结构进行实现。...为了保证数据的安全,Java提供了两种线程安全的Queue队列,分为阻塞队列和非阻塞队列(并发队列)。...下面,我们就具体来说说阻塞队列额非阻塞队列的不同实现! 5.7.1 阻塞队列 在具体讲解阻塞队列之前,需要先跟大家明确一个概念! 什么是阻塞队列?...这就是阻塞队列。 直白的来说:队列满时,生产线程停止生产;队列空时,消费线程停止活动。 阻塞队列怎么进行阻塞操作 对于队列(集合)来说,最常用的操作,无疑只有两类,一种是添加操作,一种是移除操作!...在Java中,java.util.concurrent包提供了很多阻塞队列的实现。 其中,包括: ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。

    1K120

    反应式编程框架设计:如何使得程序调用不阻塞等待

    相比传统的阻塞式的编程,Web容器线程要全部的请求处理操作,一直要等到返回响应结果才能释放线程; 使用Flower框架只需要极少的容器线程就可以处理较多的并发用户请求,而且容器线程不会阻塞。...一个Service完成业务逻辑处理之后,会返回一个处理结果,这个结果以消息的方式异步发给他的下一个Service 传统编程模型Service之间如果进行调用,被调用者返回之前,调用者Service方法只能阻塞等待...而Flower的Service之间使用了AKKA Actor进行消息的通信,调用者的Service发送调用消息之后,不需要等待被调用者返回的结果,就可以处理下一个消息了,事实上,这些Service可以复用同一个线程去处理自己的消息...,也就是说,只需要有限的几个线程就可以完成大量的Service处理和消息的传输,这些线程不会阻塞等待。...,进行真正的数据库操作,得到结果之后,将结果以异步回调的方式发送给Flower的Service进行进一步的处理操作,这个时候依然不会有阻塞的线程。

    69630

    Java集合--阻塞队列(BlockingQueue)

    1 BlockingQueue 在此章节中,我们会对阻塞队列进行详细的介绍。 如果你对队列还不熟悉,可以先去看下以下几篇文章,或许对你的入门有所启发!...Java集合--Queue队列介绍 Java集合--Queue(Java中实现1) Java集合--Queue(Java中实现2) 在讲解ArrayBlockingQueue之前,我们先来介绍下它的父类...BlockingQueue BlockingQueue是一个接口,是所有阻塞队列的父类,定义了阻塞队列的主要操作方法。...super E> c, int maxElements); } 添加方法: add:插入元素,如果队列满了,抛出异常(底层调用offer方法); put:插入元素,如果队列满了,就等待; offer...(底层调用peek方法); peek(继承父类):如果队列为空,则返回null; 移除方法: remove:移除对应元素,如果队列为空,则返回false; take:移除元素,如果队列为空,则一直等待

    64670

    Java阻塞队列之BlockingQueue

    阻塞队列的概念 当阻塞队列是空时,从队列中获取元素的操作将会被阻塞   当阻塞队列是满时,往队列里添加元素的操作将会被阻塞 ArrayBlockingQueue 数组组成的有界阻塞队列 代码示例:...,在是空的情况下take操作会等待队列有值) public static void main(String[] args) throws InterruptedException {...// 定义阻塞队列的长度为3 BlockingQueue blockingQueue = new ArrayBlockingQueue(3); // 使用put插入,如果队列已满则会一直等待队列空出来...,加入了限时秒数,等待x秒后不再阻塞) public static void main(String[] args) throws InterruptedException {...,如果队列已满则会等待1s后退出 blockingQueue.offer(1,1L,TimeUnit.SECONDS); blockingQueue.offer(2,1L

    42740
    领券