1、springboot使用线程池
@Async申明该方法是一个异步任务;
@EnableAsync可以异步执行,就是开启多线程的意思.
ThreadPoolTaskExecutor
corePoolSize:核心线程数
maximumPoolSize:最大线程数
keepAliveTime:线程存活的实现, 如果线程池当前有超过 corePoolSize 个线程,并且线程空闲的时间超过了 keepAliveTime,那么这些线程将被销毁.
TimeUnit:存活时间的单位(小时、分钟、秒、毫秒)
BlockingQueue:任务队列,用来储存等待被执行的任务, 当线程数量达到 corePoolSize 个之后,不会立即扩容线程池,而是先把任务堆积到任务队列中,任务队列满了之后,才考虑扩容线程池,一直到线程个数达到 maximumPoolSize 为止。
https://baijiahao.baidu.com/s?id=1741592692205831440&wfr=spider&for=pc
2、threadlocal、InheritableThreadLocal、TransmittableThreadLocal
不同的线程上拥有自己的变量来保存这个 ThreadLocal 值,所以他能够做到对于线程隔离的。
inheritableThreadLocals上取值时子线程就能取得到值
线程池中的线程时,主线程中的数据传递到这个子线程中,处理方式就是在TransmittableThreadLocal中。
3、线程基本使用,实现 Runnable接口
java是单继承的,在某些情况下一个类可能已经继承了某个父类,这时在用继承Thread类方法来创建线程显然不可能了。
java设计者们提供了另外一个方式创建线程,就是通过实现Runnable接口来创建线程
public class Thread02 {
public static void main(String[] args) {
Dog dog = new Dog();
//dog.start(); //这里不能调用 start 方法
//创建了 Thread 对象,把 dog 对象(实现了 Runnable ),放入了 Thread
Thread thread = new Thread(dog);
thread.start();
}
}
class Dog implements Runnable { //通过实现Runnable接口来实现
int count = 0;
@Override
public void run() { //普通方法
while (true) {
System.out.println("你好,兮动人-" + (++count) + Thread.currentThread().getName());
//休眠1秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (count == 10) {
break;
}
}
}
}
https://blog.csdn.net/qq_41684621/article/details/123980322
4、创建线程池几种方式
1. newFixedThreadPool(int nThreads)
创建一个固定长度的线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数量,这时线程规模将不再变化,当线程发生未预期的错误而结束时,线程池会补充一个新的线程。
2. newCachedThreadPool()
创建一个可缓存的线程池,如果线程池的规模超过了处理需求,将自动回收空闲线程,而当需求增加时,则可以自动添加新线程,线程池的规模不存在任何限制。
3. newSingleThreadExecutor()
这是一个单线程的Executor,它创建单个工作线程来执行任务,如果这个线程异常结束,会创建一个新的来替代它;它的特点是能确保依照任务在队列中的顺序来串行执行。
4. newScheduledThreadPool(int corePoolSize)
创建了一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer。
5、线程的生命周期
线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、死亡。
当线程进入运行状态后,一般的操作系统是采用抢占式的方式来让线程获得CPU。所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞、就绪之间切换。
https://blog.csdn.net/liwangcuihua/article/details/120056007
6、其他
Thread中start(启动)和run(运行)方法的区别
调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。
https://blog.csdn.net/qq_47768542/article/details/109702664
CountDownLatch
一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。
https://www.jb51.net/article/205849.htm
线程安全
线程安全概念:当多个线程访问某一个类(对象或方法)时,对象对应的公共数据区始终都能表现正确,那么这个类(对象或方法)就是线程安全的