精选文章 线程理解

线程理解

作者:D_J1224 时间: 2020-07-27 04:13:29
D_J1224 2020-07-27 04:13:29

线程:

线程是并发执行代码的。
 * 有两种创建方式:
 * 方式一:继承Thread并重写run方法。run方法中就是希望线程执行的逻辑
 * 方式二:实现Runnable接口。单独定义线程接口

   方式一创建线程的方法比较简单直接,但是缺点主要有两个:
      1、由于需要继承线程,这导致不能在继承其他类,在实际开发中经常要复用某个超类的功能,那么在继承线程后不能再继承其他类会有很多不便;
      2、定义线程类的同时重写了run方法,这会导致线程与线程要执行的任务有一个必然的耦合关系,不利于线程的重用。

线程图如下:

线程理解1
    
    线程提供一个静态方法:static Thread currenThread();// 该方法用来获取运行这个方法的线程
    线程提供获取自身信息的方法:
        getName()---------获取线程名字
        getId()-----------获取线程ID
        getPriority()-----获取线程优先级
        isAlive()---------判断线程是否活着
        isInterrupted()---判断线程是否被中断
        isDaemon()--------判断是否为守护线程

线程提供一个方法:void join()
       该方法可以协调线程之间的同步运行
线程提供一个静态方法:
      static void sleep(long ms)
      使运行这个方法的线程阻塞指定毫秒。超时后该线程会自动返回到Runnable状态,等待再次并发运行
    注:sleep方法要求必须处理中断异常,原因在于当一个线程调用了sleep方法处于阻塞状态的过程中若被调用了它的interrupt()方法中断时,它就会在sleep方法中抛出中断异常。这时并非是将这个线程直接中断,而是中断了它的阻塞状态
 

线程的优先级
    线程不能主动获取CPU时间片,只能被动的被线程调度器分配
    调整线程的优先级可以最大程度的改善某个线程获取CPU时间片的次数
    理论上线程优先级越高的线程获取的CPU时间片的次数就越多

同步与异步:
      同步运行:运行有顺序
      异步运行:运行代码无顺序,多线程并发运行就是异步运行

多线程并发的安全问题
      产生:当多个线程并发操作同一资源时,由于线程切换实际的不确定性,会导致执行操作资源的代码顺序未按照设计顺序执行,出现操作混乱的情况。严重时可能会导致系统的瘫痪。
     解决:将并发操作同一资源改为同步操作,及:有先后顺序的操作

      当一个方法被synchronized修饰后,该方法称为“同步方法”,即:多个线程不能同时在方法内部运行。强制让多个线程在执行同一个方法时变为同步操作就解决了并发安全问题。
      在方法上使用synchronized,那么同步监视器对象就是当前方法所属对象(监视的动作属于的类),即:方法内部看到的this。


同步块
    语法:
     synchronized(同步监视对象){
         需要同步的代码片段
  }
  
    同步块可以更精确的控制需要同步运行的代码片段。有效的缩小同步范围可以保证并发安全的前提下提高代码并发运行的效率。
    使用同步块控制多线程同步运行必须要求这些线程看到的同步监视对象为同一个。


    静态方法若使用synchroinzed修饰,那么该方法一定具有同步效果。静态方法对应的同步监视器对象为当前类的类对象(class的实例)。


互斥锁:
     * 当多个代码片段被synchronized块修饰后,这些同步块的同步监听器对象又是同一个时,这些代码片段是互斥的,多个线程不能同时在这些方法运行。


守护线程
 * 守护线程又称之为后台线程,默认创建的线程都是普通线程或者称为前台线程,线程提供一个方法:
 * void setDaemon(boolean on)
 * 只有调用该方法并传入参数true时,该线程才会被设置为守护线程
 * 
 * 
 * 守护线程在使用上与普通线程没有差别,但是在结束时机上有一个区别,即:
 * 线程结束时所有正在运行的守护线程都会被强制停止
 * 
 * 线程的结束:当一个进程中所有的普通线程都结束时,进程即结束

 

线程池:

1、线程池可以理解为公交车总站:池子就是整个公交车总站,线程就是里面的公交车。
2、线程池的作用:
    1:控制线程数量
    2:重用线程
    创建线程池的步骤:
        //创建一个线程池,线程数量为50
        1、ExecutorService threadpool=Executors.newFixedThreadPool(50);
        2、//将任务指派给线程池
            threadpool.execute(runn);

        停止线程池的两个方法:
         shutdown()方法调用后,线程池不再接收新任务,并且会将线程所有的任务执行完后再停止
         shutdownNow()方法调用后,立即停止
         

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:简单两步实现 rsync 自动同步文件免密

下一篇:composer require xxx时,会更新ClassLoader类的属性值

您可能感兴趣

  • MongoDB入门培训 | 8周入门NoSQL No.1数据库

    为什么要学好MongoDB? MongoDB是为满足企业当今的高可用性、可扩展性及满足GDPR法规等需求而设计的新一代文档数据库。凭借灵活的模式和丰富的文档结构,MongoDB能够帮助各种规模、各个行业的企业的开发人员使用丰富的数据结构快速开发应用。在各大互联网公司广泛使用,涉及范围广,为金融证券/保险/交通物流/电商/物联网/制造业/教育等多行业提供服务。 为了让更多开发者朋友更顺利地入门...

  • Python大方向的学习路线

    Python是一门应用极其广泛的编程语言。目前在Web开发领域、爬虫领域、数据分析领域、人工智能领域、机器人开发领域都有非常广泛的应用。而且Python语法相对简单,很多人采用自学或者参加培训的方式学习Python技术。那对于以就业为目的的同学,学习Python技术,应该参考怎样的学习路线呢?哪些技术是目前企业需求最紧密的技术知识点呢?本文就为大家详细介绍Python学习过程中应该了解的学习...

  • JAVA核心类库--3、可变字符串类和日期相关类

    1、可变字符串类 1.1、基本概念 由于String类描述的字符串内容是个常量不可改变,当需要在Java代码中描述大量类似的字符串时,只能单独申请和存储,此时会造成内存空间的浪费。 为了解决上述问题,可以使用java.lang.StringBuilder类和java.lang.StringBuffer类来描述字符序列可以改变的字符串,如:"ab"。 StringBuffer类是从jdk1.0...

  • 可信任的多方计算和验证仿真:一种扩展区块链的方法

    名词介绍: 多代理系统:是由多个代理共同合作来组成的。其基本单元是代理,代理可以与其所在环境进行互动(这个我理解有点儿分布式的意思) 存在的问题:代理和代理之间彼此会产生信任问题,例如某些代理是带有恶意的,或者代理的种种原因可能造成不可信的情况。 出发点(意图):为了解决上面的这个问题,保证代理的计算完整性。从而创建了可靠的分布式计算平台。 信任有两种验证方式: Validation:仿真保...

  • Java 基础之Autowired 是否是自动注入

    Java 基础之Autowired 是否是自动注入 相信很多人对Autowired 注解理解不深入,或者是认为此注解就是spring的自动注入。相信看完本篇文章,你会有更加不一样的理解。 首先我们先看下什么是手动注入?在我们的spring应用程序中,定义多个类,其中某些类依赖某些类,xml中要描述类与类之间的依赖关系,这种由程序员定义,并且描述好依赖关系的用法,我们称之为手动注入。我们看个例...

  • 漫谈 SLAM 技术(上)

    转自:https://zhuanlan.zhihu.com/p/135955964 导语 随着最近几年机器人、无人机、无人驾驶、VR/AR的火爆,SLAM技术也为大家熟知,被认为是这些领域的关键技术之一。本文对SLAM技术及其发展进行简要介绍,分析视觉SLAM系统的关键问题以及在实际应用中的难点,并对SLAM的未来进行展望。 1. SLAM技术 SLAM(Simultaneous Local...

  • 奔图P3305DN安装官网windows驱动 打印乱码解决方法

    在 奔图电子官网 下载驱动安装 ,打印测试页和文档乱码。这是因为奔图电子官网驱动适配于奔图通用市场机型,安全打印机型 只能安装随机光盘驱动,如果你的PC没有光驱,在奔图官网下载的windows驱动安装后打印出来的就会是乱码。 解决方法: 1、卸载已安装驱动 进入控制面板→程序→卸载或更改程序,查找 P antun 驱动程序卸载 在控制面板界面,查看设备和打印机,找到对应的打印机图标删除设备 ...

  • pytorch triple-loss

    一、Triplet结构: triplet loss是一种比较好理解的loss,triplet是指的是三元组:Anchor、Positive、Negative: 整个训练过程是: 首先从训练集中随机选一个样本,称为Anchor(记为x_a)。 然后再随机选取一个和Anchor属于同一类的样本,称为Positive (记为x_p) 最后再随机选取一个和Anchor属于不同类的样本,称为Negat...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。