
拿捏java线程
文章平均质量分 63
以最简单的方式教会你java线程
b顶峰相见
用博客分享技术和记录总结,不讲废话,只讲干货!
展开
-
线程并发工具类——fork-join
分而治之是一个算法设计思想,它就是把大问题分割为多个相同的小问题,并且小问题之间无关联,如果小问题之间有关联就叫做动态规划。像我们的归并排序算法就利用这个思想二、Fork-Join就体现了分而治之原理:就是在必要情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个小任务运算的结果进行join汇总起来。原创 2024-07-23 14:53:25 · 623 阅读 · 0 评论 -
线程的协作——线程之间相互配合,完成某项工作
例如:一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程,前者是生产者,后者是消费者。要想做到上面的需求,我们常规思路是:让消费者线程不断地循环检查变量是否符合预期在while循环中设置不满足的条件,如果条件满足则退出while循环,从而完成消费者的工作。但是却存在如下问题:1)难以确保及时性2)难以降低开销,如果降低睡眠的时间,比如休眠1。原创 2024-07-22 21:48:40 · 429 阅读 · 0 评论 -
四大引用——强软弱虚
强引用是在程序代码之中普遍存在的,类似于“Object obj = new Object()”,obj变量引用Object这个对象,就叫做强引用。“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。弱引用(WeakReference)也是用来描述非必需对象的,但是它的强度比软引用更弱一些,每次执行GC的时候,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。原创 2024-07-22 20:37:49 · 590 阅读 · 0 评论 -
使用ThreadLocal——解决线程共享安全问题
ThreadLocal是一个类,为每个线程都提供了变量的 副本,使得每个线程在某一时间访问到的并非同一个对象,这样就隔离了多个线程对数据的数据共享。原创 2024-07-22 19:54:51 · 1154 阅读 · 0 评论 -
volatile,最轻量的同步机制
volatile关键字只保证了线程的可见性volatile关键字不能代替synchronized关键字volatile关键字不能保证线程安全volatile关键字适用于一个线程写,多个线程读的场景。原创 2024-07-22 15:10:16 · 521 阅读 · 0 评论 -
使用synchronized关键字(基础篇)——解决线程共享安全问题
我们先来看一段代码:代码解释:我们开启两个线程去完成count++任务,一个线程加一万次,那么count值为10000,两个线程的话结果应该是20000,但是结果事与愿违,可以得出在多线程下,共同访问一个资源会引发安全问题。什么是线程间的共享?在一个进程中会有多个线程,而这些线程共享进程的资源,就称作线程间的共享。原创 2024-07-22 10:44:37 · 471 阅读 · 0 评论 -
java线程之守护线程
守护线程也称“服务线程”,它是后台线程,在没有用户线程可服务时会自动离开。主线程、我们自己开启的线程(没有设置为守护线程)就是用户线程。原创 2024-07-21 20:37:36 · 472 阅读 · 0 评论 -
线程的状态
该状态的线程位于可运行线程池中,等待被线程调度选中,获取。超时等待(TIMED_WAITING)运行状态(RUNNABLE)终止(TERMINATED)阻塞状态(BLOCKED)等待状态(WAITING)原创 2024-07-21 19:50:50 · 176 阅读 · 0 评论 -
面试官:如何实现线程按顺序执行?
我们先看一段代码:根据我们常规的思路来想(没学线程),我们先启动t1线程,再启动t2线程,肯定是t1先执行,然后执行t2,对不对?但是我们运行多次,会出现t2先执行,t1再执行!这是为什么?是因为当线程调用start方法时,该线程就会等待被分配CPU,一旦获取到了CPU,就可以开始工作。CPU是操作系统进行分配的,分配给谁是不确定的,有可能t1先得到CPU,先执行;有可能t2先得到CPU,先执行;有可能t1和t2同时拿到。这都是说不准的。那用什么方法可以确定线程的执行顺序呢?原创 2024-07-21 17:14:02 · 330 阅读 · 0 评论 -
深入理解run和start方法
我们都知道Thread类是java里对线程概念的抽象,当我们通过new Thread(),其实只是new了一个Thread的实例,还没有和操作系统中的真正的线程挂起钩来。原创 2024-07-21 16:32:21 · 321 阅读 · 0 评论 -
如何停止线程工作呢?
定义一个变量,由目标线程去不断的检查变量的状态,当变量达到某个状态时停止线程。我们可以看出t1线程中使用变量来判断是否停止执行业务逻辑,使用Thread.sleep方法让t1线程睡一会,睡醒了,看看flag标志位是否被更改,如果被更改,说明需要停止工作。但是定义变量是有问题的,分为两种情况:1.当标志位已经被我们更改,线程还在睡,睡醒了才能判断标志位是否被更改,这会导致不能及时停止线程工作问题。2.原创 2024-07-21 14:46:31 · 2122 阅读 · 0 评论 -
Java创建线程的四种实现方式
我们首先看看Thread的构造方法有哪几种,从代码中可以看出我们只传了一个参数进去,说明task要么是Runnable类型,要么是String类型,肯定不是String类型。所以我们可以大胆猜测一下,FutureTask是不是实现了Runabble接口。在上面我们可以看出Runnable的run方法不能定义返回值,Callbale接口的call方法可以定义返回值,只是使用有点复杂。可以看出,FutureTask在run方法中调用了Callable接口的call方法!后续会更新,请耐心等待。原创 2024-07-19 21:16:09 · 272 阅读 · 0 评论 -
java程序天生就是多线程
可以看到有8个线程,所以java程序天生就是多线程。这里面我们只是调用api查看当前java程序有哪些线程,原创 2024-07-19 20:34:21 · 165 阅读 · 0 评论 -
高并发编程的意义和注意事项
例如我们在实现电商系统的时候,用户一旦下单,我们就会去发短信通知用户,那用户关心你这个是怎么发送短信的吗?肯定不关心啊,所以我们就可以将向用户发送短信独立为单独的模块,并交给其它线程去执行,这样既增加了异步操作,提升了系统性能,又使程序模块化、简单化。是在面对大量并发请求时,为了保证系统的性能和处理能力,采用相应的编程技术和策略来处理并发任务。例如我们现在下载电视剧的时候,是不是不会一集一集的下,而是同时下载3,4集等等,为什么?多线程是实现高并发编程的一种常见技术和手段。可以使你的代码模块化。原创 2024-07-19 20:16:20 · 389 阅读 · 0 评论 -
并发和并行
比如单 CPU 核心下执行多线程并非是同时执行多个任务,如果你开两个线程执行,就是在你几乎不可能察觉到的速度不断去切换这两个任务,已达到"同时执行效果",其实并不是的,只是计算机的速度太快,我们无法察觉到而已。例如:吃饭的时候可以边吃饭边打电话,这两件事情可以同时执行。并发是指应用在同一时间间隔能够交替执行不同的任务。并行是指应用在同一时刻能够同时执行不同的任务。原创 2024-07-19 15:44:25 · 266 阅读 · 0 评论 -
CPU 时间片轮转机制(RR调度)
系统将所有的就绪进程按先来先服务的原则,排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;但如果顾客太多,或者每个人的饭量不一样(进程的任务大小不同),就需要合理安排每个人的服务时间(时间片的长度),以确保大家都满意。操作系统给每个进程分配一段可运行的时间,该时间就叫做时间片,如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。原创 2024-07-18 20:54:11 · 696 阅读 · 0 评论 -
java线程必学的进程和线程的概念
比如:在java中,如果你想运行一个java程序,就必须有一个main函数(main函数中啥也不写或者写一点代码),main函数一旦执行,就必定会有一个主线程。CPU 调度的最小单位,是真正执行任务的,必须依赖于进程而存在,一个进程会有多个线程,线程无处不在。线程(Thread)原创 2024-07-18 19:10:39 · 225 阅读 · 0 评论