Java线程的六种状态

# 线程的6种状态

  1. 初始(NEW):新创建了一个线程对象(Thread thread = new Thread()),但还没有调用start()方法。
  2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
  3. 阻塞(BLOCKED):表示线程阻塞于锁。synchronized这个关键字修饰的代码块或者方法,均需要获取到对应的锁,在未获取之前,其线程的状态就一直未BLOCKED
  4. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。当一个线程执行了Object.wait()的时候,它一定在等待另一个线程执行Object.notify()或者Object.notifyAll()
  5. 超时等待(TIMED_WAITING):这个状态的等待是有一定时效的,即可以理解为WAITING状态等待的时间是永久的,即必须等到某个条件符合才能继续往下走,否则线程不会被唤醒。但是TIMED_WAITING,等待一段时间之后,会唤醒线程去重新获取锁。
  6. 终止(TERMINATED):表示该线程已经执行完毕。

# 创建线程的几种方式

# 继承Thread类并重写run方法

run()为线程类的核心方法,相当于主线程的main方法,是每个线程的入口

注意

  • 一个线程调用 两次start()方法将会抛出线程状态异常,也就是的start()只可以被调用一次 。
  • native生明的方法只有方法名,没有方法体。是本地方法,不是抽象方法,而是调用c语言方法registerNative()方法包含了所有与线程相关的操作系统方法
  • run()方法是由jvm创建完本地操作系统级线程后回调的方法,不可以手动调用(否则就是普通方法)
public class UserThread extends Thread {
    @Override
    public void run() {
        // 业务 .....
    }
    
    public static void main(String[] args) {
        UserThread t = new UserThread();
        t.start();
    }
}
1
2
3
4
5
6
7
8
9
10
11

# 实现Runnable接口并重写run方法

提示

  • 覆写Runnable接口实现多线程可以避免单继承局限

  • 当子类实现Runnable接口,此时子类和Thread的代理模式(子类负责真是业务的操作,thread负责资源调度与线程创建辅助真实业务。

public class UserTask implements Runnable{
    @Override
    public void run() {
        // 业务 .....
    }

    public static void main(String[] args) {
        UserTask task = new UserTask();
        Thread thread = new Thread(task);
        thread.start();
    }
}

使用λ表达式:
new Thread(()->{
// 业务 .....            
}).start();
	
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 实现Callable接口并重写call方法

Callable与Runnable类似,添加的返回值,通过FutureTask提交任务和获取返回值。

public class Test implements Callable<String> {
    @Override
    public String call() throws Exception {
        // 业务 .....
        return "Text";
    }

    public static void main(String[] args) {
        FutureTask<String> task = new FutureTask<>(new Test());
        Thread thread = new Thread(task);
        thread.start();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 创建线程池复用线程

参考:《Java高并发编程之线程池原理》

上次更新: 2020/09/12, 13:09:00
最近更新
01
RabbitMQ简介
10-27
02
聊聊Java多态
10-21
03
JVM垃圾回收器
10-16
更多文章>