![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 64
多线程
萝卜阿咕咕
这个作者很懒,什么都没留下…
展开
-
线程中断Thread的interrupt()方法
什么时候需要关闭一个线程?下面简单的举例情况:比如我们会启动多个线程做同一件事,比如抢12306的火车票,我们可能开启多个线程从多个渠道买火车票,只要有一个渠道买到了,我们会通知取消其他渠道。这个时候需要关闭其他线程 很多线程的运行模式是死循环,比如在生产者/消费者模式中,消费者主体就是一个死循环,它不停的从队列中接受任务,执行任务,在停止程序时,我们需要一种”优雅”的方法以关闭该线程 在一些场景中,比如从第三方服务器查询一个结果,我们希望在限定的时间内得到结果,如果得不到,我们会希望取消该任务转载 2022-01-29 16:53:05 · 13471 阅读 · 1 评论 -
JVM之双亲委派机制
什么是双亲委派机制当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。类加载器的类别BootstrapClassLoader(启动类加载器)c++编写,加载java核心库 java.*,构造ExtClassLoader和AppClassLoader。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作ExtClassLoader (转载 2022-01-29 16:07:24 · 137 阅读 · 0 评论 -
JVM之垃圾回收器
堆中逻辑分代是「给内存做一些概念上的区分」,物理分代是真正的物理内存。「具体划分」新生代(young)和老年代(old/tenured)。「新生代」:刚new出来的那些对象:默认比例1「老年代」:垃圾回收了很多次都没有把它回收掉的老对象:默认比例3新生代又分为: 「eden」默认比例是8。新new出来的对象放在eden区。 「survivor」(s1) 默认比例是1。垃圾回收一次之后跑到这个区域,该区域存放的对象不同,采取的垃圾回收算法也不同。 「surviv.原创 2022-01-24 16:45:42 · 405 阅读 · 0 评论 -
JAVA线程池
线程池是什么?简单来说,线程池是指提前创建若干个线程,当有任务需要处理时,线程池里的线程就会处理任务,处理完成后的线程并不会被销毁,而是继续等待下一个任务。由于创建和销毁线程都是消耗系统资源的,所以,当某个业务需要频繁进行线程的创建和销毁时,就可以考虑使用线程池来提高系统的性能啦;避免创建大量的线程增加开销,提高响应速度。。这样我们就不需要去new线程,直接通过线程池进行;使用线程池有哪些好处?首先在开发的过程中,为什么需要线程池呢?给我们带来了那些好处提高系统的响应速度 如果每次多...原创 2022-01-24 11:03:33 · 277 阅读 · 0 评论 -
线程安全集合类
List中:Vector:线程安全,是长度可变的数组ArrayList:线程不安全的,他的线程安全替代是VectorMap:HashMap:线程不安全的,他的线程安全的替代是HashTableHashTable:HashTable是线程安全的,它给几乎所有public方法都加上了synchronized关键字...原创 2022-01-20 15:55:55 · 2849 阅读 · 0 评论 -
线程的生命周期
线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。 新建(new):就是刚使用new方法,new出来的线程; 就绪(runnable):就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行; 运行(running):当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能; 阻塞(blocked):在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sle原创 2022-01-03 22:47:44 · 3892 阅读 · 0 评论 -
线程协作方法:sleep、wait/notify、join
wait 和 sleep 区别 sleep 是 Thread 的方法,wait 是 Object 的方法 sleep 是休眠,不会释放锁,wait 是挂起,会释放锁 wait 唤醒需要用 notify 或者 notifyAll;如果没有被唤醒,则会无止境的等待下去 而 sleep 则是休眠一段时间自己就恢复,继续执行下面代码;执行完synchronize中的代码块之后,才会释放锁 wait方法需要在synchronize块或者synchronize方法里调用,然而 ...原创 2022-01-01 23:43:53 · 514 阅读 · 0 评论 -
synchronize实现秒杀
项目中,我们经常会遇到一些秒杀情况:例如:我们就只有一定量的票数量;这个时候有多个窗口进行售卖;这个时候其实就是多个线程对一个变量进行操作;这样很容易出现,当第一个线程在对全局变量进行操作时,另外一个进程也进来对变量进行操作;这样有一些时间差进行操作后,到最后,其实无法确认这个全局变量真实的值到底是多少;而且如果针对秒杀的问题的话,就会很容易出现超卖的情况;所以针对这个问题,我们后面需要对进行操作的代码块进行锁住;只开放一个线程对这个代码快进行操作;这样就会避免多个线程同一时间对同一个变量做操作;原创 2021-12-29 18:19:04 · 295 阅读 · 0 评论 -
Daemon线程
1、Daemon线程daemon线程生命周期依附于主线程,主线程执行完,daemon无论业务是否执行完成,他都会马上终止:在java中,通过Thread.currentThread().setName("刘备");===设置主线程的及其主线程名称; 而随从线程的话,直接通过对象.setDaemon(true);来设置对应的随从线程具体代码:package duoxiancheng;public class MyThread extends Thread { @O...原创 2021-12-29 18:18:12 · 1494 阅读 · 0 评论 -
synchronized关键字
synchronized是Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。所以synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍可以访问该object中的原创 2021-12-29 18:17:10 · 176 阅读 · 0 评论 -
多线程实现
实现线程的两种方式1、继承方式实现: 继承Thread类,重写run方法; 在执行时,不能直接执行调用run方法,直接调用run的方法时,不会生成新线程; 而如果要开启新线程,而是需要调用star方法,才会生成新的线程启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,步骤:继承Thread类1、定义一个类MyThr...原创 2021-12-28 17:00:18 · 314 阅读 · 0 评论