![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 64
liuhuapeng0304
00后Java工程狮一枚,喜欢瞎琢磨
展开
-
AQS原理详解
1.AQS 原理概览AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列(虚拟的双向队列即不存在队列实例,仅存在结点之间的关联关系)。AQS是将每条请求共享资源的线程封装成一个CLH锁队列的一个结点原创 2022-03-08 10:41:05 · 20531 阅读 · 0 评论 -
count++只能加锁解决吗?Atomic可以吗?
例子public class AtomicMain { public static void main(String[] args) throws InterruptedException { ExecutorService service = Executors.newCachedThreadPool(); Count count = new Count(); // 100个线程对共享变量进行加1 for (int i = 0原创 2022-01-12 09:52:57 · 509 阅读 · 0 评论 -
线程中断的几种方式
有三种方法可以使终止线程。1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。2. 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。3. 使用interrupt方法中断线程。1.使用退出标识终止线程当run方法执行完后,线程就会退出。但有时run方法是永远不会结束的。如在服务端程序中使用线程进行监听客户端请求,或是其他的需要循环处理的任务。在这种情况下,一般是将这些任务放在一个循环中,如w原创 2021-08-10 15:00:10 · 10132 阅读 · 0 评论 -
多线程中Future与FutureTask的区别
线程可以通过实现Runnable接口,或者继承Thread实现,但是这两种方式在任务执行完成之后无法获取返回结果,于是就有了Callable接口,Future接口与FutureTask类配和来取得返回的结果。Runnable从Runable的方法可以看到,是一个没有返回值的线程。CallableCallable与Runnable的功能大致相似,Callable中有一个call()函数,但是call()函数有返回值,而Runnable的run()函数不能将结果返回给客户程序。Callable的声明如原创 2021-07-22 17:30:14 · 1941 阅读 · 0 评论 -
main方法调用spring不托管的类或者使用注解(本地简易异步线程池)
场景:main方法本地引入其他对象是不收托管的。需要自己手动注入。以下仅是个参考例子。(用于本地简易异步线程池使用)· 以下是main方法测试类package com.springboot.redisdemo.controller;import lombok.extern.slf4j.Slf4j;import org.redisson.api.RLock;import org.redisson.api.RedissonClient;import org.springframework.bea原创 2021-06-30 10:07:22 · 3611 阅读 · 0 评论 -
juc三巨头CountDownLatch,CyclicBarrier,Semaphore的区别
1.CountDownLatch 是一个线程等待其他线程, CyclicBarrier 是多个线程互相等待。2.CountDownLatch 的计数是减 1 直到 0,CyclicBarrier 是加 1,直到指定值。3.CountDownLatch 是一次性的, CyclicBarrier 可以循环利用。CyclicBarrier 可以在最后一个线程达到屏障之前,选择先执行一个操作。4.Semaphore ,需要拿到许可才能执行,并可以选择公平和非公平模式...原创 2021-05-19 11:09:10 · 2542 阅读 · 0 评论 -
Thread.currentThread().interrupt()到底能不能中断线程???
interrupted()是Java提供的一种中断机制,要把中断搞清楚,还是得先系统性了解下什么是中断机制。什么是中断?在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制——中断。注:中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupted方法,该方法也仅仅是将线程对象的中断标识设成true;接着你需要自己写代码不断地检测当前线程的原创 2021-01-07 15:04:17 · 4892 阅读 · 0 评论 -
springboot并发编程CountDownLatch配合异步线程池使用
1. 首先在项目配置异步线程池,如下:@EnableAsync // 开启异步任务@Configurationpublic class TaskPoolConfig { @Bean("taskExecutor") // 线程池名称 public Executor taskExecutor() { // 使用Spring封装的异步线程池 ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecuto原创 2020-12-29 16:11:22 · 4561 阅读 · 1 评论 -
ThreadLocal详解
1.Threadlocal是什么?ThreadLocal提供了线程的局部变量,每个线程都可以通过set()和get()来对这个局部变量进行操作,但不会和其他线程的局部变量进行冲突,实现了线程的数据隔离。2.目的是什么?ThreadLocal设计的目的就是为了能够在当前线程中有属于自己的变量,并不是为了解决并发或者共享变量的问题。很多同学在初学的时候会误解3.作用?举个例子:像我们学习jdbc的时候,连接数据库。数据库连接池的连接怎么管理呢??我们交由ThreadLocal来进行管理。为什么交给它来原创 2020-11-26 11:05:29 · 3159 阅读 · 3 评论 -
为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
调用 start 方法方可启动线程并使线程进入就绪状态,而 run 方法只是 thread 的一个普通方法调用,还是在主线程里执行。原创 2020-11-09 15:30:10 · 2075 阅读 · 0 评论