Java线程的六种状态
# 线程的6种状态

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