Java线程的运行流程

2018-03-17  本文已影响0人  Visualing

上一篇文章我们讲述了Java线程概念,接下来的文章我们分析一下Java线程的运行流程

Java线程源自于JVM,受JVM管理。当我们需要使用Java线程是,我们会使用

Thread thread = new Thread()

Thread currentThread(), thread.start(), thread. isAlive(), thread. run()

Thread .sleep(), Thread.yield() , thread.join()

Thread.interrupted() ,thread. isInterrupted(), thread. interrupt()

以上方法来启动线程运行,并使用相关的方法控制线程,那么我们现在来分析一下整个过程是什么样的。

当需要新起一个线程来执行某个子任务时,就创建了一个线程Thread thread = new Thread(),创建线程了它需要已知的几个对象ThreadGroup g, Runnable target, String name

  public Thread() {
        init(null, null, "Thread-" + nextThreadNum(), 0);
    }

  private void init(ThreadGroup g, Runnable target, String name,
                      long stackSize, AccessControlContext acc) {
        //线程的名称
        this.name = name;
        Thread parent = currentThread();
        if (g == null) {
            //...线程组
            g = parent.getThreadGroup();
        }
        g.checkAccess();
        //增加线程组中未启动线程的计数。 
        //未启动的线程不会添加到线程组中,以便可以在从未启动的情况下收集这些线程
        g.addUnstarted();
        //所属线程组
        this.group = g;
        //是否为守护线程,源自于创建者是否为守护线程
        this.daemon = parent.isDaemon();
        //线程优先级
        this.priority = parent.getPriority();
        //执行代码闭包
        this.target = target;
        //调用本地方法设置线程优先级
        setPriority(priority);
        //指定线程的请求堆栈大小,如果创建者未指定堆栈大小,则为0。看虚拟机的使用情况,可用可不用
        this.stackSize = stackSize;
        //线程分配ID
        tid = nextThreadID();
    }

当利用new关键字创建线程对象实例后,它仅仅作为一个对象实例存在,JVM没有为其分配CPU时间片等线程运行资源,这个时候的线程状态为创建状态
线程创建之后,如果调用 thread.start(),线程并不会立即进入就绪状态,因为线程的运行需要一些条件,比如内存资源(程序计数器、Java栈、本地方法栈都是线程私有的),所以需要为线程分配一定的内存空间,只有线程运行需要的所有条件满足了,才进入可以准备执行的状态,这个时候的线程状态为就绪状态

  public synchronized void start() {
        //调用这个方法后,第一步是判断线程状态,必须是**创建状态**,才能使用此方法
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
        //将线程加入线程组
        group.add(this);
        boolean started = false;
        try {
            //本地方法启动
            start0();
            started = true;
        } finally {
                if (!started) {
                    group.threadStartFailed(this);
                }
            //启动收尾...
        }
    }

当线程进入就绪状态后,不代表立刻就能获取CPU执行时间,也许此时CPU正在执行其他的事情,因此它要等待。当得到CPU执行时间之后,线程便真正进入运行状态,执行代理的Runnable方法。

上一篇 下一篇

猜你喜欢

热点阅读