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

深入理解并发并行阻塞阻塞,同步异步

阻塞阻塞 首先,阻塞这个词来自操作系统的线程/进程的状态模型中,如下图: ? 一个线程/进程经历的5个状态,创建,就绪,运行,阻塞,终止。...阻塞调用:比如阻塞socket 的 send(),调用这个函数,它只是把待发送的数据复制到TCP输出缓冲区中,就立刻返回了,线程并不会阻塞,数据有没有发出去 send() 是不知道的,不会等待它发出去才返回的...阻塞是说调用的时候,线程肯定不会进入阻塞状态。 上面两组概念,就有4种组合。 同步阻塞调用:得不到结果不返回,线程进入阻塞态等待。...同步阻塞调用:得不到结果不返回,线程不阻塞一直在CPU运行。 异步阻塞调用:去到别的线程,让别的线程阻塞起来等待结果,自己不阻塞。...异步阻塞调用:去到别的线程,别的线程一直在运行,直到得出结果。 3. 并发,并行 先从定义说起,定义经过我通俗化了,原定义有点难理解。

1.2K10

深入理解并发并行阻塞阻塞,同步异步

1、阻塞阻塞 首先,阻塞这个词来自操作系统的线程/进程的状态模型中,如下图: 进程状态 一个线程/进程经历的5个状态,创建,就绪,运行,阻塞,终止。...阻塞调用:比如阻塞socket 的 send(),调用这个函数,它只是把待发送的数据复制到TCP输出缓冲区中,就立刻返回了,线程并不会阻塞,数据有没有发出去 send() 是不知道的,不会等待它发出去才返回的...阻塞是说调用的时候,线程肯定不会进入阻塞状态。 上面两组概念,就有4种组合。 同步阻塞调用:得不到结果不返回,线程进入阻塞态等待。...同步阻塞调用:得不到结果不返回,线程不阻塞一直在CPU运行。 异步阻塞调用:去到别的线程,让别的线程阻塞起来等待结果,自己不阻塞。...异步阻塞调用:去到别的线程,别的线程一直在运行,直到得出结果。 3、并发,并行 先从定义说起,定义经过我通俗化了,原定义有点难理解。

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

并发-并行-阻塞-阻塞-异步-同步-长连接-短连接-进程-线程-协程

并行和并发 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。...并行在多处理器系统中存在,而并发可以在单处理器和多处理器系统中都存在,并发能够在单处理器系统中存在是因为并发是并行的假象,并行要求程序能够同时执行多个操作,而并发只是要求程序假装同时执行多个操作(每个小时间片执行一个操作...阻塞阻塞 阻塞请求,A调用B,A一直等着B的返回,别的事情什么也不干。 阻塞请求,A调用B,A不用一直等着B的返回,先去忙别的事情了。...区别 阻塞阻最大的区别就是在被调用方返回结果之前的这段时间内,调用方是否一直等待。阻塞指的是调用方一直等待别的事情什么都不做。阻塞指的是调用方先去忙别的事情。...参考 https://www.cnblogs.com/littleswan/p/11368620.html 漫画编程:如何给女朋友解释什么是IO中的阻塞阻塞、同步、异步?

68610

深入理解同步和异步、阻塞阻塞并行和串行这几个概念

阻塞阻塞是线程视角 在我看来,阻塞阻塞是描述线程状态。...所谓阻塞是指执行某个调用后当前线程被挂起(如生产消费者模型中,无消费内容时 wait),释放CPU ,直到等得到结果被唤醒(有可消费内容时 通过 notifyAll 唤醒消费线程);阻塞是指执行某个调用后...,则就是[阻塞]。...并行和串行是 CPU 视角 并行任务通常可以拆分成多个步骤,多个CPU 核心一起执行,这类任务之间通常没有依赖关系,完全正交;串行任务每一个步骤同时只能有一个核心执行,通常有上下游依赖关系。...阻塞阻塞是线程视角,即调用之后当前线程是否被挂起。 并行和串行是 CPU 视角,即是否同时有多核一起承担同一项任务。

50920

深入理解同步和异步、阻塞阻塞并行和串行这几个概念

阻塞阻塞是线程视角 在我看来,阻塞阻塞是描述线程状态。...所谓阻塞是指执行某个调用后当前线程被挂起(如生产消费者模型中,无消费内容时 wait),释放CPU ,直到等得到结果被唤醒(有可消费内容时 通过 notifyAll 唤醒消费线程);阻塞是指执行某个调用后...,则就是[阻塞]。...并行和串行是 CPU 视角 并行任务通常可以拆分成多个步骤,多个CPU 核心一起执行,这类任务之间通常没有依赖关系,完全正交;串行任务每一个步骤同时只能有一个核心执行,通常有上下游依赖关系。...阻塞阻塞是线程视角,即调用之后当前线程是否被挂起。 并行和串行是 CPU 视角,即是否同时有多核一起承担同一项任务。

55220

使用阻塞队列实现线程同步_线程可以并行执行

一、串行,并行,并发 1.名称解释 串行:程序按顺序执行,同一时间只能执行一个程序,前一个执行完毕后才轮到后一个 并行:多个程序可以同时执行,宏观和微观上看程序都是同时执行 并发:同一时刻只有一条程序执行...,但是多个进程被快速轮换执行,宏观上看是同时执行,微观上看只是把时间分成若干段,使多个进程快速交替的执行 并发与并行关注的是程序是否在同一时间内同时被执行 2.举个例子 串行:你吃饭吃到一半,电话来了...当一个 CPU 执行一个线程时,另一个 CPU 可以执行另一个线程,两个线程互不抢占 CPU 资源,可以同时进行,这种方式我们称之为并行(Parallel)。...调用线程只有在得到结果之后才会返回 阻塞:调用指在不能立刻得到结果之前,该调用不会阻塞当前线程 阻塞阻塞关注的是程序在等待调用结果(消息,返回值)时的状态 2.举个例子 阻塞:你去书店买书,立即买到了...,或者没有立刻就走了,这就是非阻塞 阻塞:你去书店买书,如果恰好书店没有,你就等一直等到书店有了这本书买到了才走,然后后排的人必须等你走了以后才能买书 发布者:全栈程序员栈长,转载请注明出处:https

47030

15分钟读懂进程线程、同步异步、阻塞阻塞、并发并行,太实用了!

并行:当系统有一个以上CPU时,则线程的操作有可能并发。...当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel) 并发和并行的区别: 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接...js阻塞,用较少的资源就能完成同样的任务,但编程比较费神。 4。并行,类似同时利用多核cpu的各个核去计算。并发可分为伪并发、真并发。前者例如单核处理器的并发,后者发是指多核处理器的并发。 5。...(故事篇) 理解同步阻塞、同步阻塞、异步阻塞、异步阻塞、异步阻塞 同步/异步关注的是消息通知的机制,而阻塞/阻塞关注的是程序(线程)等待消息通知时的状态。...至此,关于进程线程、同步异步、阻塞阻塞、并发并行已经讲的差不多了,有讲的不好的地方请大佬指出。同时也谢谢网上大佬的文章帮助我理解了这些概念。

5.9K42

Reactor深度探索 顶

由于加载过程串行执行的关系,导致消耗实现线性累加。串行执行即Blocking模式。 并行的复杂 由以下场景来说明 ?...这里说的同步、异步是线程模型;阻塞阻塞是编程模型。在Spring中,于这种GUI回调类似的有Spring Boot的消息事件机制 ,这里面也有同步,异步,阻塞阻塞的说明。...Future链式问题 由于Future无法异步执行结果链式处理,尽管FutureBlockingDataLoader能够解决方法数据依赖以及顺序执行的问题,不过它将并行执行带回了阻塞(串行)执行。...它跟第一个DataLoader的不同在于,DataLoader是全部由主线程去阻塞执行的,而这里如果不使用join()则肯定为阻塞的,只不过join()会阻塞,这个是线程相关的常识,具体可以参考线程,...,相比于ParalleDataLoader的并行执行,只需要3秒完成来说,阻塞的好处是让主方法线程及时完成,让主方法线程池可以及时释放。

89610

并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

Java提供的线程安全的Queue可以分为阻塞队列和阻塞队列,其中阻塞队列的典型例子是BlockingQueue,阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者阻塞队列...并行和并发区别 1、并行是指两者同时执行一件事,比如赛跑,两个人都在不停的往前跑; 2、并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B...,take方法在队列空的时候会阻塞,直到有队列成员被放进来。...(producer); service.submit(producer2); service.submit(consumer); // 程序运行5s后,所有任务停止...(new Poll()); } latch.await(); //使得主线程(main)阻塞直到latch.countDown()为零才继续执行 System.out.println

82520

“既生 ExecutorService, 何生 CompletionService?”

中详细的介绍了 ExecutorService,可以将整块任务拆分做简单的并行处理; 在 不会用Java Future,我怀疑你泡茶没我快 中又详细的介绍了 Future 的使用,填补了 Runnable...假设我们有 4 个任务(A, B, C, D)用来执行复杂的计算,每个任务的执行时间随着输入参数的不同而不同,如果将任务提交到 ExecutorService, 相信你已经可以“信手拈来” ExecutorService...>>(); futures.add(executorService.submit(A)); futures.add(executorService.submit(B)); futures.add(executorService.submit...(C)); futures.add(executorService.submit(D)); // 遍历 Future list,通过 get() 方法获取每个 future 结果 for (Future...,执行时间相对任务 B,C,D 都要长很多,但是按照程序的执行顺序,程序在 get() 任务 A 的执行结果会阻塞在那里,导致任务 B,C,D 的后续任务没办法执行

67430

“既生 ExecutorService, 何生 CompletionService?”

中详细的介绍了 ExecutorService,可以将整块任务拆分做简单的并行处理; 在 不会用Java Future,我怀疑你泡茶没我快 中又详细的介绍了 Future 的使用,填补了 Runnable...ExecutorService VS CompletionService 假设我们有 4 个任务(A, B, C, D)用来执行复杂的计算,每个任务的执行时间随着输入参数的不同而不同,如果将任务提交到... futures = new ArrayList>(); futures.add(executorService.submit(A)); futures.add...(executorService.submit(B)); futures.add(executorService.submit(C)); futures.add(executorService.submit...,执行时间相对任务 B,C,D 都要长很多,但是按照程序的执行顺序,程序在 get() 任务 A 的执行结果会阻塞在那里,导致任务 B,C,D 的后续任务没办法执行

46730

Reactive Programming 一种技术,各自表述

Blocking 模式即串行执行 。 不过 Reactor 也提到,以上问题可通过并行的方式来解决,不过编写并行程序较为复杂,那么其中难点在何处呢?...(executorService.submit(super::loadUsers)); // 耗时 >= 2s runCompletely(executorService.submit...限制二: Future 不支持链式操作 由于 Future 无法实现异步执行结果链式处理,尽管 FutureBlockingDataLoader 能够解决方法数据依赖以及顺序执行的问题,不过它将并行执行带回了阻塞...尽管 CompletableFuture 不仅是异步阻塞操作,而且还能将 Callback 组合执行,也不存在所谓的 ”Callback Hell“ 等问题。...Spring WebFlux 作为 Reactive Web 框架,天然支持阻塞,不过早在 Servlet 3.1 规范时代皆以实现以上需求,其中包括 Servlet 3.1 阻塞 API ReadListener

1.1K20

Java中的BlockingQueue1 Java中的阻塞队列2 生产者和消费者例子2 Java里的阻塞队列

1 Java中的阻塞队列 1.1 简介 一种支持两个附加操作的队列,是一系列阻塞队列类的接口 当存取条件不满足时,阻塞在操作处 队列满时,阻塞存储元素的线程,直到队列可用 队列空时,获取元素的线程会等待队列空...而并发和并行则是两个非常容易混淆的概念,第一种区分方法是以程序在计算机中的执行方式来区分。...我称之为“并发执行”和“并行执行”的区分: 并发执行是指多个线程(例如n个)在一台计算机中宏观上“同时”运行,它们有可能是一个CPU轮换的处理n个线程,也有可能是m个CPU以各种调度策略来轮换处理n个线程...; 并行执行是指多个线程(n个)在一台计算机的多个CPU(m个,m>=n)上微观上同时运行,并行执行时操作系统不需要调度这n个线程,每个线程都独享一个CPU持续运行直至结束。...第二种区分方法则是“并发编程”和“并行编程”的区别: 并发编程可以理解为多线程编程,并发编程的代码必定以“并发执行”的方式运行; 并行编程则是一种更加特殊的编程方法,它需要使用特殊的编程语言(例如Cilk

1.6K71

CompletionService实践

通过FutureTask对提交任务的封装和代理然后通过call方法进行回调并将返回值存储在FutureTask中的Object中,当获取值的时候采用阻塞队列方式进行存储。...其中的阻塞队列是对FutureTask的引用,也就是说提交的任务是有序的。获取到的值也是有顺序的。 在工作中其实在某些业务场景下需要使用ComletionService进行并行处理。...因为其返回值得有序性但是对外调用的并行性相对于单线程模式的for循环,其优点不言而喻。借此机会在此做一个小demo,以供日后工作借鉴。...*/ @Override public String call() throws Exception { return this.tool+"---"+"真正的执行方法...=new ExecutorCompletionService(executorService); for (int i=0;i<10;i++){ completionService.submit

52530

【并发编程】Concurrent.util常用类

3完事后线程1再继续执行 应用场景 :zookeeper建立完连接前阻塞 建立连接后再进行zookeeper的其他操作 CyclicBarrier barrier 是障碍的意思 意思每个线程都准备好了然后在各在执行...; 两者区别: CountDownLatch 是一个线程阻塞 等n个线程完事后再执行 CountDownLatch 针对一个线程 CyclicBarrier 是多个线程处于阻塞中 然后到达一定数量后各自执行...的区别: 第一点是submit可以传入实现Callable接口的实例对象, 第二点是submit方法有返回值 Future f1 = executor.submit(future); //单独启动一个线程去执行的...future.get()); System.out.println("数据:" + future2.get()); executor.shutdown(); } } 运行结果: 两个线程并行执行...然后返回结果 一个线程执行5秒 两个线程并行执行也是耗时5秒 节省了时间 这两个线程和主线程独立的 主线程执行到future.get()阻塞 需要等待线程完成后返回结果 Semaphore 信号量 PV

25010

教校花学妹JDK批量异步任务最强工具CompletionService

CompletionService也是内部维护一个阻塞队列,当任务执行结束就把任务的执行结果加入到阻塞队列,但CompletionService是把任务执行结果的Future对象加入到阻塞队列,而上面的示例代码是把任务最终的执行结果放入了阻塞队列中...之后通过CompletionService#submit()提交三个询价操作,这三个询价操作将会被CompletionService异步执行。...最后CompletionService#take()获取一个Future对象(加入到阻塞队列的是任务执行结果的Future对象),调用Future#get()就能返回执行结果。 ?...geocoder(addr) { // 并行执行以下3个查询服务, r1=geocoderByS1(addr); r2=geocoderByS2(addr); r3=geocoderByS3...CompletionService能让异步任务的执行结果有序化,先执行完的先进入阻塞队列,利用该特性,可以轻松实现后续处理的有序性,避免无谓等待,同时还可以快速实现诸如Forking Cluster这样的需求

73340

【Java 基础篇】Java Callable与Future:并发编程的利器

Future接口的get()方法是一个阻塞方法,它会一直等待任务执行完成并返回结果。如果任务还未完成,调用该方法的线程将被阻塞。...三、使用Callable和Future 在Java中,我们可以使用ExecutorService执行Callable任务,并获得Future对象来管理任务的执行和结果。...> callable = new MyCallable(10); // 提交任务并获得Future对象 Future future = executorService.submit...通过调用submit()方法提交任务并获得Future对象。然后,我们使用get()方法等待任务执行完成并获取结果。 值得注意的是,我们在最后需要手动关闭线程池,以释放资源。...下面是一些常见的应用场景: 1、并行计算 使用Callable和Future可以方便地实现并行计算,将一个大任务拆分为多个小任务并在多个线程中并行执行

35240
领券