Thread 中文翻译为线程,关于对Thread的解释已经相当丰富完备,笔者在这里也只是拾人牙慧。
什么是线程?
理解本就是一个先来后到的过程,想要理解
thread(线程)是什么,首先要明白进程是什么,想要明白进程是什么,得先明白程序是什么?以下给出摘自百度百科的解释。 程序是指令、数据及其组织形式的描述,进程是程序的实体,是线程的容器
线程的六种状态
New尚未启动的线程,如图所示,可以调用Thread.start方法启动线程
Thread.start 方法
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}
Thread.start方法有synchronized修饰符修饰,在线程启动后thredStatus会被设置,否则会抛出IllegalThreadStateException,由此可见该方法只能调用一次。start0方法是一个native方法,调用后jvm将会执行该线程的run方法。run是Runable接口中定义的方法,类Thread实现了Runable接口。
Runbale状态包含了RUNNING和READY状态
RUNABLE
Ready
当线程对象的start的方法被调用后,就会进入Ready状态,即就绪,但是线程什么时候执行,具体看jvm的调度——线程需要获取CPU资源后,才能执行。笔者对Ready状态的理解是,该线程已经可以run,但是没有分配到CPU资源。
RUNNING
处于Ready状态的线程获得了CPU资源之后,即真正开始执行run方法体,意味着该线程就已经处于RUNNING状态了。需要注意的是,线程不一定是完整执行的,执行到一半,CPU资源就被抢走了。
Thread.yield方法
根据调度程序,当前程序愿意放弃对CPU资源的使用。这时间,该
线程会被重置为就绪状态,和其他线程一样等待调度,根据不同优先级决定的概率,该线程仍然有机会重新获得CPU资源
WAITING
进入该状态,代表当前
线程需要等待其他线程做出特定的动作(通知或者中断)
RUNNING ----> WAITING
当前线程运行过程中,其他线程调用join方法,当前线程将会进入等待状态
当前线程对象调用wait()方法
LockSupport.parK():出于线程调度的目的,禁用当前线程
WAITING-----> READY
等待的线程被其他线程唤醒,notify和notifyAll方法
LockSupport.unpark方法,与上面park方法对应,给出许可证,解除等待状态。
TIMED_WAITING
超时等待状态
区别于WAITING,它可以在指定的时间自行返回
TERMINATED
消亡状态,代表线程的终止
- 主线程和子线程不会相互影响。