Java多线程基础

基础

进程

  • 一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。
  • 一个进程一直运行,直到所有的非守候线程都结束运行后才能结束。

线程的生命周期

  • 新建状态

    • 一个新产生的线程从新状态开始了它的生命周期。它保持这个状态直到程序start这个线程。
  • 就绪状态

    • 当一个线程等待另外一个线程执行一个任务的时候,该线程就进入就绪状态。当另一个线程给就绪状态的线程发送信号时,该线程才重新切换到运行状态。
  • 运行状态

    • 当一个新状态的线程被start以后,线程就变成可运行状态,一个线程在此状态下被认为是开始执行其任务。
  • 阻塞状态(休眠状态)

    • 由于一个线程的时间片用完了,该线程从运行状态进入休眠状态。当时间间隔到期或者等待的事件发生了,该状态的线程切换到运行状态。
  • 死亡状态(终止状态)

    • 一个运行状态的线程完成任务或者其他终止条件发生,该线程就切换到终止状态。

创建线程三种方法

  • 实现Runnable接口(最简单)

  • 继承Thread类本身

    • 方法

      • start()
      • run()
  • 通过Callable 和 Future 创建线程

常见线程方法

  • sleep

    • 当前线程暂停
  • join

    • 加入到当前线程中
  • setPriority

    • 线程优先级
  • yield

    • 临时暂停
  • setDaemon

    • 守护线程

同步问题

  • 多个线程同时修改一个数据的问题

    • 数据变成脏数据
  • 又称为Concurrency(并发)问题

  • 解决问题

    • synchronized 语句块

      • 当前线程独占对象,直到释放占用
      • 被 synchronized 修饰的,称为线程安全的类
    • Lock


常见线程安全类

  • Map

    • HashMap

      • 非线程安全
      • 可以存放null
    • HashTable

      • 线程安全
      • 不能存放null
  • 字符串

    • StringBuilder

      • 非线程安全
      • 单线程速度快
    • StringBuffer

      • 线程安全
      • 多线程数据安全
  • List

    • ArrayList

      • 非线程安全
    • Vector

      • 线程安全

多线程编程

  • 多线程能满足程序员编写非常有效率的程序来达到充分利用CPU的目的,因为CPU的空闲时间能够保持在最低限度。

  • 主要概念

    • 线程同步

      • 互斥同步

        • 一个时间点只允许一个线程访问代码段
      • 条件同步

        • 通过条件变量和三个操作来实现:等待,信号和广播
      • 同步关键字

        • synchronized
    • 线程死锁


    • 线程交互

      • wait

        • 让占有this的线程等待,并临时释放占有
      • notify

        • 通知等待this的线程苏醒,可以继续占有
      • notifyAll()

        • 通知所有等待的线程
    • 线程控制:挂起、停止和恢复

    • 线程池

      • 生产消费模式

        • 对象为一个一个的任务
      • 已创建的线程循环使用

多线程使用

  • 有效利用多线程的关键是理解程序是并发执行而不是串行执行的。例如:程序中有两个子系统需要并发执行,这时候就需要利用多线程编程。
  • 通过对多线程的使用,可以编写出非常高效的程序。不过请注意,如果你创建太多的线程,程序执行的效率实际上是降低了,而不是提升了。
  • 请记住,上下文的切换开销也很重要,如果你创建了太多的线程,CPU花费在上下文的切换的时间将多于执行程序的时间。
原文地址:https://www.cnblogs.com/fengda1/p/14729230.html