首页 > 编程语言 >JUC并发编程

JUC并发编程

时间:2023-07-25 17:23:10浏览次数:45  
标签:异步 1.2 JUC 编程 并发 Future 线程 CompletableFuture 执行

一、JUC并发编程

1.1. 什么是JUC

1.1.1. 进程和线程、管程

  • 进程 -- 资源分配的最小单位

指在系统中正在运行的一个应用程序;程序一旦运行就是进程;每一个进程都有它自己的内存空间和系统资源。

  • 线程 -- 程序执行的最小单位

轻量级进程,系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。

  • 管程 -- Monitor,也就是我们平时所说的锁

一种同步机制,他保证(同一时间)只有一个线程可以访问被保护的数据和代码。

执行线程就要求先成功持有管程,然后才能执行方法,最后当方法完成(无论是正常完成还是非正常完成)时释放管程。在方法执行期间,执行线程持有了管程,其他任何线程都无法再获取到同一个管程。

1.1.2. 线程状态

  • NEW 新建
  • RUNNABLE 准备就绪
  • BLOCKED 阻塞
  • WAITING 不见不散
  • TIMED_WAITING 过时不候
  • TERMINATED 终结

1.1.3. wait和sleep的区别

  1. sleep 是 Thread 的静态方法,wait 是 Object 的方法,任何对象实例都能调用。
  2. sleep 不会释放锁,它也不需要占用锁。wait 会释放锁,但调用它的前提是当前线程占有锁(即代码要在 synchronized 中)。
  3. 它们都可以被 interrupted 方法中断。

1.1.4. 串行与并行

串行模式:

一次只能取得一个任务,并执行这个任务。

并行模式:

可以同时取得多个任务,并同时去执行这些任务。

1.1.5. 并发与并行

  • 并发:同一时刻多个线程在访问同一个资源,多个线程对一个点。
    • 例子:春运抢票 电商秒杀...
  • 并行:多项工作一起执行,之后再汇总。
    • 例子: 泡方便面,电水壶烧水,一边撕调料倒入桶中

1.1.6. 用户线程和守护线程

  • 用户线程
  1. 是系统的工作线程,它会完成这个程序需要完成的业务操作。
  • 守护线程
  1. 是一种特殊的线程为其它线程服务的,在后台默默地完成一些系统性的服务,比如垃圾回收线程就是最典型的例子。

  2. 守护线程作为一个服务线程,没有服务对象就没有必要继续运行了,如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了系统可以退出了。所以假如当系统只剩下守护线程的时候,java虚拟机会自动退出。

如果用户线程全部结束意味着程序需要完成的业务操作已经结束了,守护线程随着JVM一同结束工作。

setDaemon(true)方法必须在start()之前设置,否则报llegalThreadStateException异常。

1.2 CompletableFuture

1.2.1 Future接口

Future接口定义了操作 异步任务 执行一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。

1.2.2 Future接口优缺点

  • 优点
    future+线程池异步多线程任务配合,能显著提高程序的执行效率。

  • 缺点
    Future对于结果的获取不是很友好,只能通过阻塞或轮询的方式得到任务的结果。

阻塞方法:get()

在Future计算完成之前会一直处在阻塞状态下。

轮询:isDone()

容易耗费CPU资源

1.2.3 引入CompletableFuture

对于真正的异步处理我们希望是可以通过传入回调两数,在Future结束时自动调用该回调函数,这样,我们就不用等待结果。

CompletableFuture提供了一种观察者模式类似的机制,可以让任务执待完成后通知监听的一方。

1.2.4 CompletableFuture是什么

  • 在Java8中,CompletableFuture提供了非常强大的Future的广展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合 CompletableFuture 的方法。
  • 它可能代表一个明确完成的Future,也有可能代表一个完成阶段(CompletionStage),它支持在计算完成以后触发一些函数或执行某些动作。
  • 它实现了Future和CompletionStaqe接口。

image

1.2.5 CompletionStage接口

  • CompletionStage代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另外一个阶段
  • 一个阶段的计算执行可以是一个Function, onsumer或者Runnable,比如: stage.thenApply(x -> square(x).thenAccept(x-> System.out.print(x)).thenRun(0 -> System.out.printIn0))
  • 一个阶段的执行可能是被单个阶段的完成触发,也可能是由多个阶段一起触发

1.2.6 CompletableFuture的优点

  • 异步任务结束时,会自动回调某个对象的方法;
  • 主线程设置好回调后,不再关心异步任务的执行,异步任务之间可以顺序执行;
  • 异步任务出错时,会自动回调某个对象的方法;

1.2.7 CompletableFuture四大核心方法

  • runAsync 无 返回值

    • public static CompletableFuture runAsync(Runnable runnable)
    • public static CompletableFuture runAsync(Runnable runnable,Executor executor)
  • supplyAsync有 返回值

    • public static<U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)
    • public static<U> CompletableFuture<U> supplyAsync(Supplier<U> supplierExecutor executor)

没有指定Executor的方法,直接使用默认的ForkJoinPool.commonPool()作为它的线程池执行异步代码。

如果指定线程池,则使用我们自定义的或者特别指定的线程池执行异步代码

1.3 函数式编程

image

1.3

1.3.1 二级目录5

内容5

标签:异步,1.2,JUC,编程,并发,Future,线程,CompletableFuture,执行
From: https://www.cnblogs.com/pearl-t/p/17579416.html

相关文章

  • 解决C语言编程常见问题,轻松提高编程水平!
    遇到错误时应该如何处理   当遇到错误时,不要惊慌失措。首先要查看错误提示信息,如果是中文提示就直接阅读,如果是英文提示则进行翻译理解。根据错误提示定位到错误发生的代码行数,通常错误就在该行的上下几行代码中。不要偷懒,马上向他人询问问题,这样对自己负责任。成长需要经历......
  • 状态机编程
    伪代码实例:洗衣机 功能需求由功能转变状态图梳理状态之间的转换的关系梳理状态之间的转换的关系(添加切换条件)代码编程#include"stdio.h"#include"string.h"#include"stdlib.h" #defineSELF_CHECK_STATUS(1)//上电自检#defineIDEL_STATUS(2)//空闲#defi......
  • java.util.concurrent 编程范例
    java.util.concurrent范例之一java.util.concurrent之一Java代码packagetest;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassTestThreadPool{ publicstaticvoidmain(Stringargs[])thr......
  • 多线程并发修改集合案例
    //单线程使用修改集合ArrayListarrayList=newArrayList();for(inti=0;i<100;i++){arrayList.add(i);}intbatch=10;intsize=arrayList.size();if(0<size&&size&l......
  • 【网络编程】基础知识(Web Server和HTTP协议)
    WebServer一个WebServer就是一个服务器软件(程序),或者是运行这个服务器软件的硬件(计算机)。其主要功能是通过HTTP协议与客户端(通常是浏览器(Browser))进行通信,来接收,存储,处理来自客户端的HTTP请求,并对其请求做出HTTP响应,返回给客户端其请求的内容(文件、网页等)或返回一个Error......
  • 好家伙!阿里最新版高并发系统设计涵盖了“三高”所有骚操作
    为啥都爱面高并发?首先为啥面试官喜欢问高并发、性能调优相关的问题,我想有两点原因:第一,本身互联网区别于传统软件行业的特点之一就是海量请求。传统软件公司每秒用户几个、几十个的请求很常见,但是互联网公司哪怕一个二线的App,后端接口请求一天几个亿也很正常。业务特点导致对候选人......
  • GlassFish 3.1.1 的JMS 独立客户端编程
    下面文章很长,至于我的最终解决方法是在独立客户端的项目上右键->库->添加JAR/Folder加入C:\ProgramFiles\glassfish-3.1.2\glassfish\lib\gf-client.jar文件最近一直在关注JMS,起因是从Magento的PHP系统向JMS发送消息。实验了ActiveMQ,GlassFish与ActiveMQ的集成。最后还是......
  • 编程常用的变量命名英文缩写
    Aaddr=addressapp=applicationarg=argumentasm=assembleasyn=asynchronizationauth=authorization/authenticationavg=averageBbuf=bufferCcalc=calculatecert=certificatecmd=commandcmp=comparecol=columncoord=coordinates......
  • java并发编程(二)---上下文切换
    一、什么是上下文切换?  即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,线程会在分配的时间片内执行任务,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几......
  • 深入理解 Serverless 计算的并发度
    作者:西流背景2019年Berkeley预测Serverless将取代Serverful计算[1],成为云计算的计算新范式。Serverless为应用程序开发提供了一种全新的系统架构,其凭借着弹性伸缩省事省心,按需付费更低成本、聚焦业务降低OPS这三大核心价值,将开发人员从繁重的手动资源管理和性能成本优......