线程基本概念

111 阅读1分钟

线程

线程是依附于进程的,而进程是分配资源的基本单位,一个进程可以生成多个线程,这些线程有共享的进程资源。


为什么需要多线程

  • CPU非常快
  • 现代CPU是多核的
  • Java执行模型是同步/阻塞的
  • 默认情况下只有一个线程

线程的创建运行

  • 创建
    • 创建Thread的子类并重写run()
    • 实现Runnable接口
  • 运行 - 使用start()而不是直接使用run()

Main线程和子线程关系

  • Main线程是个非守护线程,不能设置成守护线程(由jvm创建,运行时不能操作Thread.setDaemon()

  • Main线程结束后,子线程可以正常运行(Main线程只是个普通的非守护线程)


并发和并行

  • 并发:一个处理器同时处理多个任务(逻辑上的同时发生)
  • 并行:多个处理器同时处理不同任务(物理上的同时发生)

线程的生命周期

Java线程有 **新建(NEW)、就绪(RUNNABLE)、阻塞(BLOCKED)、无时限等待(WAITING)、有时限等待(TIMED_WAITING)、和死亡(TERMINATED)**6种状态。

  • NEW - 创建了新线程,但还没有开始执行

  • RUNNABLE - 正在执行(running)或等待执行(ready to run)

  • BLOCKED - 因等待监视器锁(monitor lock)而阻塞

  • WAITING - 无时限等待其他线程

    调用下面的方法可以进入这个状态:

    • Object.wait()
    • Thread.join()
    • LockSupport.park()
  • TIMED_WAITING - 有时限等待其他线程

    • 调用带超时参数的 Thread.sleep(long millis) 方法;
    • 获得 synchronized 隐式锁的线程,调用带超时参数的 Object.wait(long timeout) 方法;
    • 调用带超时参数的 Thread.join(long millis) 方法;
    • 调用带超时参数的 LockSupport.parkNanos(Object blocker, long deadline) 方法;
    • 调用带超时参数的 LockSupport.parkUntil(long deadline) 方法。
  • TERMINATED - 执行完run()或执行run()时遇到异常退出