• 概念
    • 进程
      • 程序的一次动态执行过程
      • 它对应了从代码加载,执行至执行完毕的一个完整过程
      • 这个过程也是进程本身从产生,发展至消亡的过程
      • 特点
        • 进程是系统运行程序的基本单位
        • 每一个进程都有自己独立的一块内存空间,一组系统资源
        • 每一个进程的内部数据和状态都是完全独立的
      • 在操作系统中,可以有多个进程
    • 线程
      • 进程中执行运算的最小单位
      • 可以完成一个独立的顺序控制流程
      • 每个进程中,必须至少建立一个线程(主线程)来作为这个程序运行的入口点
      • 如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为"多线程"
      • 多线程的好处&优势
        • 充分利用CPU的资源
        • 简化编程模型
        • 带来良好的用户体验
    • 主线程的重要性
      • 它是产生其他子线程的线程
      • 通常它必须最后完成执行,因为它执行各种关闭动作
  • 实现
    • 继承thread
      • 特点
        • 编写简单,可直接操作线程;适用于单继承
    • 实现Runnable接口
      • 特点
        • 避免单继承局限性;便于共享资源
      • 步骤
        • 定义MyRunnable类实现Runnable接口,并实现run()方法,在run()方法中实现输出数据
        • 创建MyRunnable类的对象MyRunnable
        • 创建一个Thread类的对象myThread,将myRunnable对象作为Thread类构造方法的参数传入
        • 调用myThread对象的start()方法启动线程
    • 使用一个线程的步骤
      • 定义一个线程,同时指明这个线程所要执行的代码,即期望完成的功能
      • 创建线程对象
      • 启动线程
      • 终止线程
    • start() 和 run()的区别
      • 调用start()方法表示该线程处于启动状态,run()方法只是单纯的实例方法
  • 状态
    • 线程一般具有五种状态:创建,就绪,运行,堵塞,死亡状态​
    • 创建状态
      • 在程序中用构造方法创建了一个线程对象后,新的线程对象就处于创建状态
      • 此时,它获取了相应的资源,但还没有处于可运行状态
      • 这时可以通过Thread类的方法来设置线程对象的属性,如设置线程名,优先级等
    • 就绪状态
      • 使用start()方法启动线程,进入就绪状态,等待CPU资源
    • 运行状态
      • 当就绪的线程获得CPU资源时,即可转入运行状态,执行run()方法
      • 对只有一个CPU的计算机而言,任何时刻只能有一个处于运行状态的线程占用cpu,获得cpu资源
    • 阻塞状态
      • 一个正在运行的线程因某种原因不能继续运行时,进入阻塞状态
      • 可能使线程暂停的条件
        • 由于线程优先级比较低,因此它不能获得CPU资源
        • 使用sleep()方法使线程休眠
        • 通过调用wait()方法,使线程等待
        • 通过调用yield()方法,线程显式让出cpu控制权
        • 线程由于等待一个文件,i/o事件被阻塞
    • 死亡状态
      • 一个线程的run()方法运行完毕,线程则进入死亡状态
      • 处于死亡状态的线程不具有继续运行的能力
  • 同步
    • 使用线程同步的原因
      • 多线程共享数据引发的问题
      • 由于多个线程并发执行操作同一共享资源时,将带来数据不安全问题
    • 同步关键字
      • synchronized
      • 同步代码方法或同步代码块(this)
    • 同步方法
      • 使用synchronized修饰的方法控制对类成员变量的访问
      • 每个类实例对应一把锁,方法一旦执行,就独占该锁,直到该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态
      • 语法
        • <synchronized> 访问修饰符 synchronized 返回类型 方法名(参数列表){}
      • 同步方法缺陷
        • 如果将一个运行时间比较长的方法声明成synchronized将会影响效率
    • 同步代码块
      • 语法
        • synchronized(syncObject){代码块}
    • 同步注意事项
      • 当多个并发线程访问同一个对象object的synchronized(this)同步代码块时,同一时刻只能有一个线程得到执行,其他线程必须等待当前线程执行完毕之后才能执行该代码块
      • 当一个线程访问object的一个synchronized(this)同步代码时,其他线程对object中所有其他synchronized(this)同步代码块的访问被阻塞;即线程获得这个object的对象锁,其他线程对该object对象所同步代码部分的访问都被暂时阻塞
      • 当一个线程访问object的synchronized(this)同步代码块时,其他线程仍可以访问该object的非synchronized(this)同步代码块
    • 同步时,休眠放到同步锁外面
posted on 2019-03-12 07:56  baiUait  阅读(132)  评论(0)    收藏  举报