1、线程的生命周期、一个线程从创建到销毁会经历哪些过程,首先在java.lang.Thread类中有一个State有枚举标明了线程的6种状态
public enum State {
NEW,//初始状态线程被创建,还没有调用start方法
RUNNABLE,//运行状态,JAVA线程把操作系统中的就绪和运行状态统称为“运行中”,调用start()方法只是在java虚拟机中运行,可能等待操作系统其他资源
BLOCKED,//阻塞状态,表示线程进入等待状态,多个线程竞争同一个锁其中一个线程获得锁,其他线程进入阻塞状态
WAITING,//等待执行,一般是由于其他线程调用了wait(),join()、park()方法
TIMED_WAITING,//等待一定时间后没有执行就返回wait,join、sleep、parkNanos、parkUntil、parkNanos
TERMINATED;//终止状态、表示线程执行完成
}
如图
2、启动一个线程是调用start()方法,首先可以看下start()方法
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
/* Notify the group that this thread is about to be started
* so that it can be added to the group's list of threads
* and the group's unstarted count can be decremented. */
group.add(this);
boolean started = false;
try {
start0();//调用native()方法
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 */
}
}
}
private native void start0();
start0()是在Thread的静态代码块中注册的
private static native void registerNatives();
static {
registerNatives();
}
registerNatives的本地方法定义在文件 Thread.c 定义了各个操作系统平台要用的关于线 定义了各个操作系统平台要用的关于线 程的公共数据和操作以下是 Thread.c Tc的全部内容
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/00cd9dc3c2b5/src/share/native/java/lang/Thread.c
可以看到start0()是调用的jvm中的JVM_StartThread(),可以在hostspot源码中jvm.cpp中找到
在Thread.cpp中找到以下内容
调用create_thread方法,
最后调用start方法启动线程
3、线程的终止,线程终止最好不要直接调用stop方法,该方法会直接停止线程、造成正在执行的任务中断,引起数据的错误等。一般通过调用interrupt方法,当其他线程调用当前线程的interrupt方法,表示告诉当前线程可以终止线程了,至于什么时候终止线程取决于线程本身,这种方式让线程有机会去清理资源
例:
public class InterruptDemo {
private static int i;
public static void main(String[] args) {
Thread thread = new Thread(()->{
while(!Thread.currentThread().isInterrupted()){
i++;
System.out.println("当前线程没有中断i:"+i);
}
System.out.println("InterruptDemo.main thread is interrupt " +i);
},"interrupt demo");
thread.start();
try {
TimeUnit.SECONDS.sleep(1);
// thread.stop(); //stop 方法 句不会执行( System.out.println("InterruptDemo.main thread is interrupt " +i);)
// thread.interrupt(); // 该句会执行( System.out.println("InterruptDemo.main thread is interrupt " +i);)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}