JUC系列——基础知识 day1-1

article/2025/9/19 18:37:42

JUC系列——基础知识 day1-1

  • JUC基础知识
    • 进程
    • 线程
    • 进程和线程区别
    • 并行与并发
    • 同步
      • 使用场景
    • 异步
      • 使用情景
    • QuickStart(new Thread方式创建新线程)
      • 匿名内部类方式
      • lambda简化
    • Thread类(仅分析功能)
      • 优先级常量
      • 方法(常用)
    • 使用Runnable创建线程
      • lambda简化
    • FutureTask来创建线程(可允许返回值)
      • lambda简化

JUC基础知识

进程

程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。
进程就是用来加载指令、管理内存、管理IO的,当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。

进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程

线程

一个进程之内可以分为一到多个线程。
一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给CPU执行
Java中,线程作为最小调度单位,进程作为资源分配的最小单位。在 windows 中进程是不活动的,只是作为线程的容器

进程和线程区别

  1. 进程基本上相互独立的,而线程存在于进程内,是进程的一个子集
  2. 进程拥有共享的资源,如内存空间等,供基内部的线程共享
  3. 进程间通信较为复杂
    • 同一台计算机的进程通信称为IPC (Inter-process communication)
    • 不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,例如HTTP
  4. 线程通信相对简单,因为它们共享进程内的内存,一个例子是多个线程可以访问同一个共享变量
  5. 线程更轻量,线程上下文切换成本一般上要比进程上下文切换低

并行与并发

单核cpu下,线程实际还是串行执行的。
操作系统中有一个组件叫做任务调度器,将cpu的时间片(windows 下时间片最小约为15毫秒)分给不同的线程使用,只是由于cpu在线程间(时间片很短)的切换非常快,人类感觉是同时运行的。
总结为一句话就是:微观串行,宏观并行
线程轮流使用CPU的做法就是并发

在多核cpu下每个核都可以调度运行线程,这时候线程可以是并行的

  • 并发(concurrent):同一时间应对多件事情的能力
  • 并行(parallel):同一时间动手做多件事情的能力

同步

需要等待结果返回再去执行下一个“事件”就是同步
同步在多线程的可以指的是多个线程步调一致

使用场景

遇到即时性一定要有返回结果的业务时使用

异步

无需等待返回结果,直接进行下一个“事件”就是异步
多线程能够让方法执行变为异步的

使用情景

例如遇到一个业务会占用很长的时间时我们可以使用异步避免主线程被堵塞

QuickStart(new Thread方式创建新线程)

匿名内部类方式

 public static void main(String[] args) {System.out.println(Thread.currentThread().getName());//创建线程final Thread thread = new Thread(){@Overridepublic void run() {System.out.println("我是新线程");System.out.println(Thread.currentThread().getName());}};System.out.println("我是主线程");//启动线程thread.start();}

在这里插入图片描述

lambda简化

    public static void main(String[] args) {System.out.println("我是主线程");System.out.println(Thread.currentThread().getName());new Thread(()->{System.out.println("我是新线程");System.out.println(Thread.currentThread().getName());}).start();}

在这里插入图片描述

Thread类(仅分析功能)

优先级常量

  • MAX_PRIORITY:线程可以拥有的最大优先级
  • MIN_PRIORITY:线程可以拥有的最低优先级
  • NORM_PRIORITY:分配给线程的默认优先级

方法(常用)

  1. checkAccess():确定当前运行的线程是否有权限 修改这个线程
  2. currentThread():返回对当前正在执行的线程对象的引用
  3. getId() :返回此线程的标识符。
  4. getName() :返回此线程的名称。
  5. getPriority() :返回此线程的优先级。
  6. getStackTrace() :返回表示堆栈转储的堆栈跟踪元素数组 这个线程的。
  7. getState() :返回此线程的状态。
  8. getThreadGroup() :返回该线程所属的线程组。
  9. interrupt() :中断这个线程。
  10. interrupted() :测试当前线程是否被中断。
  11. isAlive() :测试此线程是否存在。
  12. isDaemon() :测试此线程是否为守护线程。
  13. isInterrupted() :测试此线程是否已被中断。
  14. join() join​(long millis) join​(long millis, int nanos) :等待这个线程死掉。参数表示等待时间
  15. run() : 如果此线程是使用单独的 Runnable运行对象,然后 Runnable对象的 run方法被调用; 否则,此方法不执行任何操作并返回
  16. setDaemon​(boolean on) :将此线程标记为 守护 线程 或用户线程。
  17. setName​(String name) :将此线程的名称更改为等于参数 name.
  18. setPriority​(int newPriority) : 更改此线程的优先级。
  19. sleep​(long millis) :使当前执行的线程休眠(暂时停止 执行)为指定的毫秒数,受制于 系统计时器和调度程序的精度和准确性。
  20. start() :使该线程开始执行; Java虚拟机 调用 run这个线程的方法。
  21. yield() :向调度程序提示当前线程愿意让步 它当前使用的处理器。

使用Runnable创建线程

创建TmpThread类实现Runnable接口,重写run方法

public class TmpThread implements Runnable {@Overridepublic void run() {System.out.println("我是新线程");}
}

new Thread的时候传入TmpThread的实例,调用start方法开启

    public static void main(String[] args) {System.out.println("我是主线程");System.out.println(Thread.currentThread().getName());final TmpThread tmpThread = new TmpThread();final Thread thread = new Thread(tmpThread);System.out.println(thread.getName());thread.start();}

lambda简化

由于Runnable是函数式接口所以我们可以直接这样写

    public static void main(String[] args) {System.out.println("我是主线程");System.out.println(Thread.currentThread().getName());Runnable r = ()->{System.out.println("我是新线程");};final Thread thread = new Thread(r);System.out.println(thread.getName());thread.start();}

FutureTask来创建线程(可允许返回值)

FutureTask能够接收Callable类型的参数,用来处理有返回结果的情况

 public static void main(String[] args) throws ExecutionException, InterruptedException {final FutureTask<String> stringFutureTask = new FutureTask<String>(new Callable<String>() {@Overridepublic String call() throws Exception {return "使用callable创建线程";}});final Thread thread = new Thread(stringFutureTask);thread.start();//阻塞,直到结果返回final String s = stringFutureTask.get();System.out.println(s);}

lambda简化

public static void main(String[] args) throws ExecutionException, InterruptedException {final FutureTask<String> stringFutureTask = new FutureTask<String>(()->{return "使用callable创建线程";});final Thread thread = new Thread(stringFutureTask);thread.start();//阻塞,直到结果返回final String s = stringFutureTask.get();System.out.println(s);}

http://chatgpt.dhexx.cn/article/EKEuKEwX.shtml

相关文章

JUC系列(六)

1、AbstractQueuedSynchronizer之AQS AbstractQueuedSynchronizer简称为AQS&#xff0c;抽象的队列同步器 AQS&#xff1a;是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石&#xff0c;使用一个int类变量表示持有锁的状态&#xff0c;通过内置的FIFO队列…

JUC系列(一)

1、为什么多线程极其重要&#xff1f; ​ 多线程变得极其重要的原因从软硬件两个方面来说&#xff0c;首先硬件方面&#xff1a;主要是摩尔定律失效&#xff0c;它是由英特尔创始人之一Gordon Moore(戈登摩尔)提出来的,其内容是当价格不变时&#xff0c;将每隔18个月&#xff…

JUC系列(一)什么是JUC?

多线程一直Java开发中的难点&#xff0c;也是面试中的常客&#xff0c;趁着还有时间&#xff0c;打算巩固一下JUC方面知识&#xff0c;我想机会随处可见&#xff0c;但始终都是留给有准备的人的&#xff0c;希望我们都能加油&#xff01;&#xff01;&#xff01; 沉下去&#…

JUC系列——JUC入门及多线程并发

文章目录 前言一、JUC简介1、出自哪位大神之手&#xff1f;2、JUC是什么&#xff1f; 二、JUC主要解决什么问题&#xff1f;1、进程 、线程2、并发、并行3、JAVA创建线程的方式&#xff08;模拟三种线程实现方式&#xff09;1&#xff09;继承Thread类&#xff08;线程的初级用…

Java进阶|JUC系列(持续更新)

文章目录 1、什么是J.U.C2、进程、线程、协程2.1 简介2.2 线程有几个状态2.3 wait和sleep的区别 3、Lock锁(重点)3.1 简介3.2 lock锁和synchronized有什么区别 4、生产者和消费者问题4.1 简介4.2 使用synchronized实现的demo4.3使用Lock实现的demo 5、锁的是谁问题1、两个线程访…

莱布尼茨公式C语言编程,高等数学——手撕牛顿莱布尼茨公式

本文始发于个人公众号&#xff1a;TechFlow&#xff0c;原创不易&#xff0c;求个关注 今天是高等数学专题的第13篇文章&#xff0c;我们来看看定积分究竟应该怎么计算。 定积分的实际意义 通过之前的文章&#xff0c;我们基本上熟悉了定积分这个概念和它的一些简单性质&#x…

[计算机数值分析]牛顿插值公式

Spring-_-Bear 的 CSDN 博客导航 埃特金算法虽然具有承袭性&#xff0c;但其算式是递推型的&#xff0c;不便于进行理论上的分析。所以采用具有承袭性的显式的牛顿插值公式是不错的选择。 p n ( x ) f ( x 0 ) f ( x 0 , x 1 ) ( x − x 0 ) . . . f ( x 0 , x 1 , . . . …

如何用计算机做牛顿迭代公式,牛顿迭代法

牛顿迭代法(Newtons method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。 中文名 牛顿迭代法 外文名 Newtons method别 名 牛顿-拉夫逊(拉弗森)方法 提出时间 17世纪 牛顿迭代法产生背景 编辑…

牛顿恒等式 牛顿和

前言&#xff1a;仅个人小记。该恒等式推导逻辑非常简洁。目标&#xff1a;求一个多项式的所有根的次幂和。比如多项式 P ( x ) Σ i 0 n a i x i P(x)\Sigma_{i0}^{n}a_i x^i P(x)Σi0n​ai​xi的根为 α , β , . . . , ω \alpha,\beta,...,\omega α,β,...,ω&#xff…

牛顿插值公式

均差&#xff08;差商&#xff09; f[x0,x1]f(x1)−f(x0)x1−x0 一阶 f[x0,x1,x2]f(x1,x2)−f(x0,x1)x2−x0 二阶 ⋮ 性质 1.对上述二解均差展开&#xff0c;得&#xff0c; f[x0,x1,x2]f(x0)(x0−x1)(x0−x2)f(x1)(x1−x0)(x1−x2)f(x2)(x2−x0)(x2−x1) 依次类推 有&am…

5.3 牛顿-科茨公式

学习目标&#xff1a; 理解微积分基础知识&#xff0c;例如导数和微分的概念。学习牛顿-科茨公式的推导过程。这个公式实际上是使用泰勒公式对被积函数进行展开&#xff0c;并使用微积分的基本原理进行简化得到的。学习如何使用牛顿-科茨公式进行数值积分。这通常涉及到将被积…

牛顿迭代公式

问题背景 给定任意一个数x&#xff0c;求其平方根z&#xff0c;平方误差小于0.001。 这个问题直观的去想&#xff0c;我们一般会采取设定一个初始值&#xff0c;然后通过迭代逐渐逼近平方根&#xff0c;但是初始值怎样去迭代才能更快”逼近“成为关键问题&#xff0c;牛顿迭代…

人工智能数学基础---定积分3:微积分基本公式(牛顿-莱布尼茨公式)

一、引言 在《人工智能数学基础—定积分1&#xff1a;定积分的概念以及近似计算》介绍了利用定积分的定义进行定积分的近似计算方法&#xff0c;但这种方式比较复杂&#xff0c;如果被积函数复杂困难更大&#xff0c;那么定积分是否有其他计算方式呢&#xff1f;答案是肯定的&…

二分法求解方程的根java_【数值分析】利用二分法和牛顿公式求解方程的根

1.实验内容 ​分别利用牛顿公式和二分法对某一方程(此实验是以开方公式为准&#xff0c;即x2-c0,在验证时取c115)进行求解。且对两者的求解结果进行比较&#xff0c;比较两者的迭代次数和精度。 分别编写函数Binary(min, max, times)和 Newton(x0, times)实现以上两种方法。实验…

验证牛顿公式的局部收敛性,并找到对于牛顿公式不收敛(发散)的函数,比较二分法与牛顿公式的收敛速度

文末有代码&#xff0c;大家可以自己跑一下&#xff0c;体会一下牛顿法的运算过程 二、实验目的&#xff1a; a.验证牛顿公式的局部收敛性&#xff1b; b.比较二分法与牛顿公式的收敛速度&#xff1b; c.验证求解结果的正确性&#xff1b; 三、实验内容 a.在验证牛顿公式的…

牛顿迭代公式(详细)

牛顿迭代公式 X n 1 X n − f ( x ) f ′ ( x ) X_{n1} X_n -\frac{f(x)}{f(x)} Xn1​Xn​−f′(x)f(x)​ 上网搜了很久,搞懂了一点,简单记录一下 其实弄懂了一点后会发现它并不是很高大上&#x1f605; . 先来一段代码 求9的平方根,java实现 public static void main…

牛顿-莱布尼茨公式

牛顿-莱布尼兹公式&#xff08;Newton-Leibniz formula&#xff09;&#xff0c;通常也被称为微积分基本定理&#xff0c;揭示了定积分与被积函数的原函数或者不定积分之间的联系。 牛顿-莱布尼茨公式的内容是一个连续函数在区间 [ a&#xff0c;b ] 上的定积分等于它的任意一个…

python语言培训是密封式的吗

述&#xff08;最多18字 以下试题内容来源由-众课帮-公众号和小程序提供 可查询更多的试题答案新鲜尿液有氨臭味 变异性心绞痛患者首选药物是 A_______ofdependenceonGMOseedsandchemicalfertilizers,pesticides(杀虫剂),andherbicides&#xff08;除草剂&#xff09;isthencre…

【业界分享】字节跳动如何用 7 年,成为腾讯最可怕的对手?张一鸣一语道破...

点击上方&#xff0c;选择星标或置顶&#xff0c;每天给你送干货&#xff01; 阅读大概需要16分钟 跟随小博主&#xff0c;每天进步一丢丢 转载自公众号&#xff1a;开发者技术前线 2019 年&#xff0c;字节跳动被预估广告收入可达 1000 亿元。 说到互联网巨头&#xff0c;很多…