Java多线程学习总结
文章平均质量分 52
澜色海湾
这个作者很懒,什么都没留下…
展开
-
21.0、Java多线程——线程池
背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大思路:提前创建好 多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁的创建、销毁,实现重复利用,类似生活中的公共交通工具好处:1、提高响应速度(减少了创建新线程的时间)2、降低资源消耗(重复利用线程池中线程,不需要每次都创建)3、便于线程管理(......) corePoolSize:核心池的大小 maximumPoolSize:最大线程数 ...原创 2022-07-21 21:43:05 · 176 阅读 · 0 评论 -
20.0、Java多线程——线程协作-->生产者/消费者模式
如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,知道仓库中的产品被消费者取走为止。如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库中再次放入产品为止。对于生产者,没有生产产品之前,要通知消费者等待,而生产了产品之后,又需要马上通知消费者消费。假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费。对于消费者,在消费之后,要通知生产者已经结束消费,需要生产新的产品以供消费。消费者不能直接使用生产者的数据,他们之间有个“缓冲区”,...原创 2022-07-21 16:48:11 · 213 阅读 · 1 评论 -
19.0、Java多线程——ReentrantLock可重入锁
锁提供了对共享资源的独占访问。ReentrantLock类实现了Lock,他拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以。从JDK5.0开始,Java提供了更强大的线程同步机制——通过显示定义同步锁对象来实现同步。Lock是显式锁(手动开启和关闭锁,不要忘记关闭锁)synchronized是隐式锁,出了作用域自动释放。Lock>同步代码块(已经进入了方法体,分配了相应资源)>同步方法(在方法体之外)...原创 2022-07-21 15:10:12 · 108 阅读 · 0 评论 -
18.0、Java多线程——死锁
多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对象释放资源,都停止执行的情形,某一个同步块同时拥有。总的来说就是多个线程互相抱着对方需要的资源,然后形成僵持。...原创 2022-07-21 12:35:22 · 160 阅读 · 0 评论 -
17.0、Java多线程——synchronized同步方法及同步块
synchronized方法控制对“对象”的访问,每个对象对应一把锁,每个synchronized方法都必须获得调用该方法的对象锁才能执行,否则线程会阻塞,方法一旦执行,就独占该锁,直到该方法返回才释放锁,后面被阻塞的线程才能获得这个锁,继续执行。同步方法中无需指定同步监视器,因为同步方法的同步监视器就是this,就是这个对象本身,或者是class【这类涉及到反射的知识】obj可以是任何对象,但是推荐使用共享资源作为同步监视器,记住锁的对象必须得是变化的量,具体指的就是需要增、删、改的对象。......原创 2022-07-20 20:42:16 · 210 阅读 · 0 评论 -
16.0、Java多线程——线程同步机制
什么是并发? 并发就是同一个对象被多个线程同时操作举个例子: 10000 人同时抢 1张票,或者两个人同时取一张卡里的钱什么是线程同步? 现实生活中,我们会遇到 “ 同一个资源很多人都想使用 ” 的问题,比如,食堂排队打饭,每个人都想吃饭,最天然的解决办法就是 -> 排队,一个个来。那么排队在程序中就叫做 队列 处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象,那么这时候我们就需要线程.........原创 2022-07-20 11:11:51 · 212 阅读 · 0 评论 -
15.0、Java多线程——守护线程
比如说gc()垃圾回收线程就是守护线程,虚拟机不需要等待他执行完毕,我们不需要管他甚至都看不见他,虚拟机只要等待正常的用户线程执行结束了就会停止。比如说我们的main主线程就是用户线程,当我们的main()执行完毕程序就结束了。这里能够看到当我们的用户线程还在执行尚未结束的时候,守护线程也会一直执行下去。4、守护线程的作用如后台记录操作日志、监控内存、垃圾回收等等......线程的Daemon默认设置是false,也就是。3、虚拟机不用等待守护线程执行完毕。想要将我们自定义的线程类变成。...原创 2022-07-19 21:50:55 · 424 阅读 · 0 评论 -
14.0、Java多线程——线程的优先级
上面代码中我们在run()方法中输出每条线程的优先级,必须在每条线程进入就绪状态之前设置优先级,否则进入就绪之后再设置将不起作用,如果不给线程设置优先级则默认为5级。线程的优先级越高则权重越大,越能够被CPU优先调度,但是也不是百分之百,因为优先级低只是意味着获得调度的概率低,并不是优先级低就不会被调用了,这都是要看CPU的调度情况了。可以看到t1虽然设置的优先级为5,t4的优先级为10,但是由于CPU先行调度了t1线程所以尽管t4优先级高于t1,却是t1先执行。...原创 2022-07-19 21:02:49 · 382 阅读 · 0 评论 -
13.0、Java多线程——线程五种状态的观测
正在等待另一个线程执行动作达到指定等待时间的线程处于此状态·然后线程执执行的开头需要休眠1秒钟所以这一秒中线程的状态都是TIMED_WAITING。这些状态是不反映任何操作系统流程状态的虚拟机状态。最后线程执行结束所以后台输出的线程状态是TERMINATED。正在等待另一个线程执行特定动作的线程处于此状态。在Java虚拟机中执行的线程处于此状态。被阻塞等待监视器锁定的线程处于此状态。尚未启动的线程处于此状态。已退出的线程处于此状态。......原创 2022-07-18 20:49:00 · 116 阅读 · 0 评论 -
12.0、Java多线程——线程强制执行-join
可以看到当主线程执行到200的时候,vip线程强行插队,让主线程阻塞停止,让自己先执行完毕,再去执行主线程。Join合并线程,待此线程执行完成后,再执行其他线程,其他线程会处于阻塞状态中。可以想象成插队——>...原创 2022-07-18 13:10:52 · 160 阅读 · 0 评论 -
11.0、Java多线程——线程礼让
让CPU重新调度,但是礼让一定是成功的但是CPU调度的时候不一定成功,就是说也许重新调度之后还是调度了原来的线程去跑。礼让线程,让当前正在执行的线程暂停,但不阻塞。将线程从运行状态转为就绪状态。a线程正在执行...a线程已经停止...b线程正在执行...b线程已经停止...a线程正在执行...b线程正在执行...a线程已经停止...b线程已经停止......原创 2022-07-18 12:44:09 · 502 阅读 · 0 评论 -
10.0、Java多线程——线程休眠
sleep存在异常InterruptedException;sleep(时间)指定当前线程阻塞的毫秒数;每一个对象都有一个锁,sleep不会释放锁。sleep时间达到后线程进入就绪状态;sleep可以模拟网络演示,倒计时等;原创 2022-07-18 11:47:46 · 1643 阅读 · 0 评论 -
9.0、Java多线程——线程停止
线程状态: 停止线程: 不推荐使用JDK提供的stop()、destory()方法。【已废弃使用】 推荐线程自己停下来 建议使用一个表示为进行终止变量,当flag=false,则终止线程运行接下来用代码来实现一下:.........原创 2022-07-18 11:14:44 · 462 阅读 · 1 评论 -
8.0、Java多线程——Lambda表达式
Lambda表达式: λ希腊字母表中排序第是一位的字母,英文名称为Lambda 避免匿名内部类定义过多 其实质属于函数式编程的概念我们学习Lambda表达式之前,先来了解一下什么是 函数式接口: 理解Functional Interface(函数式接口)是学习 Java8 lambda表达式的关键所在。 函数式接口的定义: 任何接口,如果质保函唯一一个抽象方法,那么他就是一个函数式接口,如下所示:原创 2022-07-18 00:45:00 · 598 阅读 · 0 评论 -
7.1、Java多线程——静态代理模式
这件事情中我就是真实角色,要做的事情就是结婚。而婚庆公司就是代理角色,他需要在我结婚之前在婚礼现场做一些布置,在结婚之后要问我结尾款,那么最终做了三件事分别是布置现场、结婚、问我结尾款。举个简单的例子,假设。............原创 2022-07-16 14:56:11 · 223 阅读 · 0 评论 -
7.0、Java多线程——实现Callable接口创建线程
4、创建执行服务ExecutorServiceser=Executor.newFixedThreadPool(1);5、提交执行Futrueresult1=ser.submit(1);6、获取结果booleanr1=result1.get();他实现的是Callable接口,并且重写的是call()方法,然后在通过ser去提交开启线程,开启后不同的地方是会返回一个值。7、关闭服务ser.shutdownNow();2、重写call方法,需要抛出异常。...原创 2022-07-16 14:05:58 · 306 阅读 · 0 评论 -
6.0、Java多线程——简单案例&龟兔赛跑
3、判断如果有已经产生胜出者就将当前线程停止、否则就判断一下当前是否有胜出者产生。2、for循环判断如果是兔子的线程且%10==0就让兔子休息一会。5、故事中是乌龟赢的,兔子需要睡觉,所以我们来模拟兔子睡觉。1、定义一个winner胜出者用于另一个线程的停止。1、首先来个赛道距离,然后要离终点越来越近。4、如果上述情况都不符合该线程就前进一米。6、最终,乌龟赢得了比赛。...原创 2022-07-16 12:52:32 · 642 阅读 · 0 评论 -
5.0、Java多线程——初识并发问题
假设我们现在有10张票,小明、小红、小兰3个人在同时在购票机器上买票,当购票完成的时候我们会发现同一张票可能被多个人买到。当多个线程操作同一个资源的情况下,线程会不安全,并发问题就会引起的数据紊乱。...原创 2022-07-15 21:19:06 · 261 阅读 · 0 评论 -
4.0、Java多线程——Runnable接口实现线程的创建
这两种创建线程的方式有一个共同点就是都需要重写run方法,只不过一个是extendThred一个是implementsRunnable,最后在启动线程start();方法的时候有一些区别,前者是直接用自定义类对象去直接调用start();方法启动线程因为他直接继承了Thread类,后者需要创建一个Thread对象并且把自定义类的对象传进去才可以开启线程start();方法。......原创 2022-07-15 18:44:34 · 861 阅读 · 0 评论 -
3.0、Java多线程——实现多线程同步下载图片
第一步:在pom.xml文件中导入相关依赖,如下:第二步:创建 TestThread.java 文件,代码如下:我这里是本地下载所以 url 前面加了一个file:/// 不然会报错,非本地下载更换 url 的路径即可第三步:执行 main 主函数后可以看到后台输出 以及 图片下载的位置,如下所示 这里输出的结果表示在main函数执行后,这些线程有CPU去调度,我们无法人为的干涉,所以执行的顺序每一次可能都不一样。 由于线程间切换交替执行的速度很快(切换的时间单位为原创 2022-07-15 17:55:19 · 862 阅读 · 0 评论 -
2.0、Java多线程——创建线程以及执行线程的方式
如果直接调用run()方法main函数会按照顺序执行,但是如果调用start()方法,可以看到上面图中执行的结果表明两个线程在相互切换交替进行。3、创建线程对象,调用start()方法启动线程。2、重写run()方法,编写线程执行体。1、自定义线程类继承Thread类。线程会由cpu去调度,不能由人为控制。,执行并不一定会按照顺序执行。...原创 2022-07-15 16:42:56 · 281 阅读 · 0 评论 -
1.0、Java多线程——线程、进程、多线程的概念
如果是模拟出来的多线程,即在一个cpu的情况下,在同一时间点,cpu只能执行一个代码,因为切换的很快,所以就有同时执行的错觉。就比如说我们在边看书的同时听音乐,这两件事情看上去我们的确是是同时进行的,但是我们大脑的一瞬间要么在看书要么在听音乐,只是这两者切换的很快很快,我们无法察觉。4、在一个进程中,如果开辟了多个线程,线程的运行有调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为干预的;2、在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程;说起进程,就不得不说下。.原创 2022-07-15 15:35:01 · 168 阅读 · 0 评论