java 线程6种状态、生命周期、线程启动原理

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();
        }
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值