线程的概念

  1. 线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程,也可以有多个线程

    线程的创建

    :::info

    一、创建线程的方法:

    :::

  2. 第一种方法:编写一个类,并且继承java.lang.Thread类,重写run( )方法

    1. public class MyFirstThread extends Thread {
    2. @Override
    3. public void run() {
    4. System.out.println("这是分支线程---------");
    5. }
    6. }
  • 在main方法中 new出创建的线程,调用start( )方法,就启动了一个线程
  • start( )方法的作用是在jvm中开辟新的栈空间
  • 启动成功的线程,会自动调用run( )方法,并且run( )在分支栈的栈底部,run( )方法和main( )方法是平级的,都在各自栈的底层(压栈)

  1. 第二种方法:编写一个类,实现java.lang.Runnable接口,实现run( )方法
    1. class MySecondThread implements Runnable{
    2. @Override
    3. public void run() {
    4. System.out.println("这是第二个分支线程---------");
    5. }
    6. }
  • 这个创建出来的类,并不是一个线程!最多是一个可运行的类!
  • 在main方法中,创建可运行的对象
  • 将可运行的对象传进 Thread( )的有参构造中创建线程对象

建议: 使用第二种方法创建线程对象,因为Java只支持单继承,却能实现多个接口。


  1. 第三种方法:使用匿名内部类创建线程对象

    1. new Thread(new Runnable() {
    2. @Override
    3. public void run() {
    4. System.out.println("这是第三个分支线程---------");
    5. }
    6. }).start();

    :::info

    二、线程在内存中的运行状态

    :::

  2. 运行线程的start( )方法时,线程在内存中的状态


线程的生命周期

:::info

一、线程的五个状态

:::

  1. 新建状态——>new出来
  2. 就绪状态——>调用start( )方法、解除阻塞事件
  3. 运行状态——>run( )方法开始执行
  4. 阻塞状态——>遇到阻塞事件
  5. 死亡状态——>run( )方法结束 :::info

    二、流程图(没加方法)

    ::: 线程 - 图1

  6. 就绪状态:就绪状态的线程又叫做可运行状态,表示当前线程具有抢夺CPU时间片的权利(CPU时间片就是执行权)。当一个线程抢夺到CPU时间片之后,就开始执行run( )方法。

  7. 运行状态:run( )方法执行,标志着线程进入运行状态,当之前占有的CPU时间片用完后,线程会重新回到就绪状态继续抢夺cpu时间片,当再次抢到puc时间片时,就重新进入run( )方法接着上一次的代码继续往下执行。
  8. 阻塞状态:当一个线程遇到阻塞事件(例如用户输入),或者sleep( )方法时,此时线程会进入阻塞状态,阻塞状态的线程会放弃之前占有的CPU时间片。当阻塞状态解除时,线程会重新回到就绪状态继续抢夺CPU时间片。

线程状态控制

:::info

一、启动线程start( )

:::

  1. 在创建好线程对象之后,通过调用start( )方法来启动线程 :::info

    二、睡眠线程sleep( )

    :::

    线程通讯

lock锁

线程池

ThreadLocal类

定时器