多线程

作者: 周六不算加班 | 来源:发表于2021-09-06 14:42 被阅读0次

    一、应用

    1、spring 中应用

    tomcat,每次访问生成一个线程

    数据库链接池

    定时任务

    异步方法@Async

    二、线程池

    作用

    线程池里面有一定数量的线程,让它们执行各种各样的任务,线程执行完任务,不会销毁自己,继续执行下一个任务。避免频繁的创建线程、销毁线程。

    ExecutorService  threadPool = Executors.

    newFixedThreadPool(10)

    threadPool.execute()或者submit()

    工作原理

    提交任务,先看线程池里的线程数是否小于

    corePoolSize也就是10,如果是小于直接创建线程来执行任务,次线程执行完任务以后,回去一个队列里面获取新的任务,如果没有任务就会阻塞等待新的任务到来。

    线程池参数,

    1、corepoolsize,默认创建线程数量

    2、最多创建线程数量

    当默认的线程,使用完了,就会创建额外的线程

    3、间隔时间

    额外的线程执行完以后,经过设定的时间销毁。

    4、任务队列

    无界队列与有界队列

    无界队列有可能出行内存问题。

    有界队列满了以后,任务会根据策略来执行,

    1、丢弃警报,2、丢弃不警报,3,丢弃时间最久的任务,4、在线程池外创建线程。

    也可以自定义策略,多余的任务可写入数据库中或者队列中异步执行。

    三、ThreadLocal

    线程操作线程内的变量,不去操作公共内存的变量,保证线程的安全性。

    四、锁

    synchronized,

    JVM层面的关键字,moniter指令,

    moniterenter加锁,moniterexit解锁。

    在对象头中有计数器,当线程获取对象时

    计数器+1,可重入,同一个线程连续加锁。等待队列

    可修饰类,对象,方法变量等。 无论修饰什么都是对象级别的加锁。

    jdk1.8以后经过优化,有锁升级功能,

    无锁,偏向锁(默认上一个线程),轻量级(cas),重量级锁。

    重量级锁涉及到用户态,内核态的的切换,很浪费资源

    lock

    jdk中的类

    Reentranlock

    默认非公平锁,

    实现原理,AQS

    State变量——cas——失败后入队列等待——释放锁后唤醒

    宕机情况

    服务器宕机以后,队列中的任务会丢失。要保存的话需要再任务开始时在数据库中存入任务信息和状态,结束时更改状态。

    相关文章

      网友评论

          本文标题:多线程

          本文链接:https://www.haomeiwen.com/subject/tvusehtx.html