Java线程池

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

  • 线程安全

线程安全概念:当多个线程访问某一个类(对象或方法)时,对象对应的公共数据区始终都能表现正确,那么这个类(对象或方法)就是线程安全的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值