![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java多线程
文章平均质量分 72
immdwbs
这个作者很懒,什么都没留下…
展开
-
定时任务线程池ScheduledThreadPoolExecutor
最大线程数设为Integer.MAX_VALUE,非核心线程空闲时间设置为0。(1)schedule在任务提交delay时间后执行执行结果: (2)scheduleAtFixedRate 在任务提交initialDelay时间后第一次执行,接下来每个周期执行一次,周期的时间大小为max(任务执行所需时间,period)。a、运行结果:initialDelay为5,任务执行时间为4,period为2 b、运行结果:initialDelay为5,任务执行时间为1,period为2 (2)scheduleW原创 2022-07-14 11:55:29 · 1345 阅读 · 0 评论 -
Java线程池及相关类
1、关系图(1)主要包括四个部分:被调用接口,接口的调用方,调用结果,被调用方接口和调用结果的结合。(2)Thread类要求传入Runnable接口的实现,无法只传入Callable接口的实现,所以不能直接使用Thread运行获取运行结果。但通过引入RunnableFuture就能够通过Thread运行并从RunnableFuture中得到运行的结果。2、Runnable接口和Callable<T>接口(1)Runnable接口存在缺陷:不能返回运行的结果且无法抛出受检查的异原创 2022-03-09 15:35:59 · 389 阅读 · 0 评论 -
原子类及CAS
1、原子类的作用能够保证线程安全,优点:相对于锁粒度更细(变量级别);通过CAS实现,在竞争更不激烈的情况下效率更高。2、原子类纵览3、基本类型原子类:AtomicInteger常用方法(1)常规的获取和赋值:get(),set(),getAndset()(2)基于CAS的赋值:compareAndSet(int,int) 在比较与预期值相同时进行赋值,并返回赋值操作的是否成功(3)线程安全的i++,i--: getAndIncrement()和getAndDecre...原创 2021-11-10 19:48:16 · 237 阅读 · 0 评论 -
多线程中的控制并发流程的工具类
1、CountDownLatch(倒计时门闩)(1)流程CountDownLatch是事件驱动的,当计数不断减少达到到0时,等待的线程(调用CountDownLatch.await()的线程)会被唤醒。(2)主要方法a、构造函数:传入要倒计数的次数b、await:让调用的线程进入阻塞状态,直到计数为0c、countDown():倒计数(3)用法:一等多:一个线程等待多个线程运行完成(并行运行,但完成顺序有先后)后开始运行,常用场景如检查多等一:在一个线程c...原创 2021-11-04 09:41:23 · 151 阅读 · 0 评论 -
Java中的锁
1、Synchronized的不足(1)试图获取锁时无法设置超时,也无法响应中断(2)不够灵活,加锁解锁的方式单一(与读写锁对比)(3)无法法知道是否成功获取了锁2、Lock接口(1)lock()与unlock() 用于获取锁释放锁,作用和synchronized作用相同,不同点在于发生异常时synchronized会自动释放锁,而lock()必须通过unlock()手动释放(2)tryLock():Boolean立刻尝试获取锁,获取到返回true,未获取到返回false;如果.原创 2021-11-02 18:09:21 · 156 阅读 · 0 评论 -
不变性与final的用法
1、不变性如果一个对象被创建之后状态就不能被修改就具有不变性,具有不变性的对象一定是线程安全的。2、final修饰变量属性被声明为final后只能被赋值一次,一旦被赋值就不能修改(1)final修饰的是是基本类型的数据,就表示这个数据不能变(2)final修饰的是对象引用,该引用的指向不能变(不能指向其他对象),但指向的对象的属性(内容)是可以变的(3)final修饰的变量是类的一般属性时赋值的时机:变量声明时等号右边,构造函数中,初始化代码块中(4)final修饰的变量是类原创 2021-11-01 17:16:16 · 85 阅读 · 0 评论 -
ThreadLocal的使用及原理
1、使用场景(1)每一个线程需要一个独享的对象(通常是工具类,如SimpleDateFormate)代码实现1:将SimpleDateFormat作为静态变量,多个线程之间共用,由于SimpleDteFormat是线程不安全的所以会出错,打印出相同的时间;如果在format()前加上锁会使得效率变的非常低。代码实现2:每次都创建一个SimpleDateFormat对象,这样会创建1000个对象,造成很大的浪费代码实现3:使用ThreadLocal并覆盖初始化...原创 2021-10-27 13:46:24 · 184 阅读 · 0 评论 -
死锁及相关检测与处理
1、发生死锁的4个必要条件(1)互斥条件,一个资源只能被一个线程持有(2)请求保持条件,保持自己资源的同时请求其他资源(3)不剥夺条件,不存在外界的介入,将资源从线程中剥夺。(4)循环等待,构成环形依赖2、死锁实例:银行转账3、死锁定位(1)利用命令行jstack进入${JAVA_HOM}/bin,运行jps获取进程id,通过jstack [进程ID]查看检测到各个线程的状态:检测到死锁信息如下:(2)利用代码:Thread...原创 2021-10-24 12:02:41 · 330 阅读 · 0 评论 -
线程属性与异常处理
1、线程属性子线程会继承父线程的属性 (1)线程ID,主要是Jvm使用的,是从1(主线程)开始递增的用于标记每一个线程。(2)守护线程和用户线程:当所有的用户线程运行结束时,JVM会退出,程序运行结束。守护线程不影响JVM的退出。(3)java线程的优先级有10个级别,默认是5,JVM会把java的优先级映射到操作系统中,不同操作系统的优先级数目不同,且优先级会被操作系统改变,因此程序设计不依赖于优先级。2、线程未捕获异常处理...原创 2021-10-19 17:07:30 · 107 阅读 · 0 评论 -
线程的生命周期
1、线程的生命周期(状态)(1)线程一共有6种状态分别为:New:新创建状态,当new一个Thread对象,但未调用start方法后就处于该状态Runnable:可运行状态,可运行状态实际上分为两种状态一种时Running(正在运行),另 一种是Ready(已准备),这两种状态统称为可运行状态,当线程的start方法被调用后 就会处于reedy状态,此时线程会等待分配CPU时间片,当获取到时间片之后就处于 running状态,同理当时间片用完(系统调度,或调用了yield方法)之后就又回到了re原创 2021-10-19 17:01:10 · 1818 阅读 · 0 评论 -
synchronized解析
1、作用:保证在同一个时刻只能有一个线程运行该段代码(synchronized修饰的代码段或方法),以保证并发安全。2、用法:一个类可以有多个的实例对象,一个类只有一个class对象用于描述这个类,根据锁的对象的类型(普通实例对象,class对象)将用法分为对象锁和类锁。(1)对象锁:锁的对象为普通实例对象,两种形式:(method1,method2)方法锁(非static方法的锁对象为this即当前实例对象)和同步代码块锁(指定的锁对象)(2)类锁:锁的对象为class对象,两种.原创 2021-10-17 17:56:32 · 81 阅读 · 0 评论