JUC系列(一)什么是JUC?

article/2025/9/19 18:36:23

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

沉下去,再浮上来,我想我们会变的不一样的。

在这里插入图片描述
先看张图,舒缓下心情,再继续吧

JUC 系列

  • JUC系列(一)什么是JUC?
  • JUC系列(二)回顾Synchronized关键字
  • JUC系列(三)Lock 锁机制详解 代码理论相结合
    正在持续更新中…

一、JUC简介

JUC实际上就是我们对于jdk中java.util .concurrent 工具包的简称。这个包下都是Java处理线程相关的类,自jdk1.5后出现。

在这里插入图片描述

二、进程与线程

2.1、进程

概述:

进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 在当代面向线程设计的计算机结构中,进程是线程的容器程序是指令、数据及其组织形式的 描述进程是程序的实体

定义:

狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。

广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

2.2、线程

线程(thread) 是操作系统能够进行运算调度的最小单位。它被包含在进程之 中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流, 一个进程中可以并发多个线程,每条线程并行执行不同的任务

1、线程是独立调度和分派的基本单位。2、同一进程中的多条线程将共享该进程中的全部系统资源。3、一个进程可以有很多线程,每条线程并行执行不同的任务。可并发执行。

当然,我们Java都知道的线程的同步是Java多线程编程的难点,因为要给哪些地方是共享资源(竞争资源),什么时候要考虑同步等,都是编程中的难点。😭所以才有了那么多滴锁,看到烦人。

2.3、创建线程的三种常见方式

  1. 通过实现Runnable接口来创建Thread线程
public class TheardCreateDemo {public static void main(String[] args) {Runnable runnable = new SomeRunnable();Thread thread1 = new Thread(runnable);thread1.start();//lamda表达式方式Thread thread2 = new Thread(() -> {System.out.println("使用lamda表达式方式");});thread2.start();}
}
class SomeRunnable implements Runnable
{@Overridepublic void run(){System.out.println(Thread.currentThread().getName()+":: 通过实现Runnable接口来创建Thread线程");}
}

2.通过继承Thread类来创建一个线程

public class TheardCreateDemo {public static void main(String[] args) {SomeThread thread = new SomeThread();thread.start();}
}class SomeThread extends Thread{@Overridepublic void run() {System.out.println("通过继承Thread类来创建一个线程");}
}

3.通过实现Callable接口来创建Thread线程

public class TheardCreateDemo {public static void main(String[] args) throws ExecutionException, InterruptedException {FutureTask<Object> futureTask = new FutureTask<Object>(new SomeCallable<Object>());Thread oneThread = new Thread(futureTask);oneThread.start();// 这里可以在运行之后获得 返回值System.out.println(futureTask.get());}
}class SomeCallable<Object> implements Callable<Object> {@Overridepublic Object call() throws Exception {System.out.println("通过实现Callable接口来创建Thread线程");// 这个是可以返回数据的 这里就随便返回个 1024 哈return (Object)" 这个是可以返回数据的 这里就随便返回个哈";}
}

这里之后有篇文章还会讲到这个点的。

这里稍微讲下步骤:

}
步骤1:创建实现Callable接口的类SomeCallable

步骤2:创建一个类对象:Callable oneCallable = new SomeCallable();

步骤3:由Callable创建一个FutureTask对象:

FutureTask futureTask= new FutureTask(oneCallable);

注释:FutureTask是一个包装器,它通过接受Callable来创建,它同时实现了Future和Runnable接口。
步骤4:由FutureTask创建一个Thread对象:Thread oneThread = new Thread(futureTask);

步骤5:启动线程:oneThread.start();

这里为什么Thread(FutureTask futureTask)可以勒?

Thread的构造函数:

public Thread(Runnable target) {this(null, target, "Thread-" + nextThreadNum(), 0);
}

原因:因为套娃套到一起啦。😁

public class FutureTask<V> implements RunnableFuture<V> public interface RunnableFuture<V> extends Runnable, Future<V> 

线程池的创建方式之后有一章会讲到,就不在此处增加篇幅啦。

三、并发和并行

在了解并发和并行之前,让我们先来看一看串行是什么样的吧。

1)串行模式:

串行模式:即表示所有任务都是按先后顺序进行。串行是一次只能取的一个任务,并执行这个任务。

举个生活中的小例子:就是在火车站买票,今天只开放这一个窗口卖票,那么我们只有等到前面的人都买了,才能轮到我们去买。即按先后顺序买到票。

2)并行模式:

概述:一组程序按独立异步的速度执行,无论从微观还是宏观,程序都是一起执行的。对比地,并发是指:在同一个时间段内,两个或多个程序执行,有时间上的重叠(宏观上是同时,微观上仍是顺序执行)。

并行模式:并行意味着可以同时取得多个任务,并同时去执行所取得的这些任务。

我们还是用上面那个例子:还是在买票,以前是只有一个窗口卖票,但是近几年发展起来了,现在有五个窗口卖票啦,大大缩短了人们买票的时间。

并行模式相当于将长长的一条队列,划分成了多条短队列,所以并行缩短了任务队列的长度。不过并行的效率,一方面受多进程/线程编码的好坏的影响,另一方面也受硬件角度上的CPU的影响。

3)并发:

并发并发指的是多个程序可以同时运行的一种现象,并发的重点在于它是一种现象,并发描述的是多进程同时运行的现象。但真正意义上,一个单核心CPU任一时刻都只能运行一个线程。所以此处的"同时运行"表示的不是真的同一时刻有多个线程运行的现象(这是并行的概念),而是提供了一种功能让用户看来多个程序同时运行起来了,但实际上这些程序中的进程不是一直霸占 CPU 的,而是根据CPU的调度,执行一会儿停一会儿。

4)小小的总结一下:

并发:即同一时刻多个线程在访问同一个资源,多个线程对一个点

  • 例子:秒杀活动、12306抢回家的票啦、抢演唱会的票…

并行:多个任务一起执行,之后再汇总

  • 例子:电饭煲煮饭、用锅炒菜,两个事情一起进行,(最后我们一起干饭啦干饭啦😁)

四、用户线程和守护线程

用户线程:指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。

守护线程是指在程序运行的时候在后台提供一种通用服务的线程,用来服务于用户线程;不需要上层逻辑介入,当然我们也可以手动创建一个守护线程。(用白话来说:就是守护着用户线程,当用户线程死亡,守护线程也会随之死亡)

比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。

用一个简单代码来模拟一下:

未设置为守护线程时:主线程执行完成了,但是我们自己创建的线程仍然未结束。

在这里插入图片描述

设置为守护线程后:明显可以看到,当主线程执行完成后,我们设置为守护线程的那个线程也被强制结束了。

在这里插入图片描述

setDaemon就是设置为是否为守护线程。

五、自言自语

最近又开始了JUC的学习,感觉Java内容真的很多,但是为了能够走的更远,还是觉得应该需要打牢一下基础。

最近在持续更新中,如果你觉得对你有所帮助,也感兴趣的话,关注我吧,让我们一起学习,一起讨论吧。

你好,我是博主宁在春,Java学习路上的一颗小小的种子,也希望有一天能扎根长成苍天大树。

希望与君共勉😁

待我们,别时相见时,都已有所成


http://chatgpt.dhexx.cn/article/1OuQgRTB.shtml

相关文章

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;很多…

VR旅游应用案例解析,世界那么大用VR去看看!

中国旅游研究院(文化和旅游部数据中心)发布“2019年上半年全国旅游经济运行情况”中显示上半年旅游经济平稳运行,预计国内旅游人数30.8亿人次,国内旅游收入2.78万亿元,同比分别增长8.8%和13.5%。由相关数据显示,旅游消费如今已经成为民众的一个重要生活方式。 同时为了不断…

从虚机到容器,秒拍架构师告诉你如何平滑进行业务迁移

近期&#xff0c;炫一下&#xff08;北京&#xff09;科技有限公司&#xff08;简称“一下科技”&#xff09;短视频产品“秒拍”完成了一个“大动作”——将原来部署在虚拟机上的主体业务迁移到华为云&#xff0c;同时将公司的技术体系承载在下一代虚拟技术容器&#xff08;Do…

git中如何取消忽略文件

问题现象描述&#xff1a; 在每天的git-----pull时&#xff0c;操作失败。报文件冲突的异常。而该冲突文件却是自己已被忽略的文件&#xff0c;在网上通用的在.gitignore文件中取消忽略的办法无法实现&#xff0c;因为.gitignore文件中根本没有哪行命令是决定该文件的忽略操作…