美文网首页
Java线程的运行流程

Java线程的运行流程

作者: Visualing | 来源:发表于2018-03-17 10:23 被阅读0次

上一篇文章我们讲述了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方法。

相关文章

  • Java线程的运行流程

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

  • java中什么是线程

    java中什么是线程 什么是线程 线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进...

  • Java的线程36-39

    线程、多线程与线程池总结--孙福生 Java中的线程 线程是进程当中的一个执行流程多进程:在OS中能(同时)运行多...

  • 多线程之信号量(By C++)

    信号量在多线程中,主要是用于线程的同步或者限制线程运行的数量。 所谓同步,当流程1运行在线程1中,流程2运行在线程...

  • 4. Java并发编程基础

    Java多线程 Java程序的运行是main线程和多个其他线程的同时运行,包括JVM内部线程 使用多线程的原因:更...

  • 线程基本知识

    多线程原理 自定义线程类: 测试类: 流程图: 程序启动运行main的时候,Java虚拟机启动一个进程,主线程ma...

  • 3、并发编程-Java线程

    并发编程 Java线程 创建和运行线程 查看线程 线程API 线程状态 创建和运行线程 方法一,直接使用new T...

  • Java基础之多线程

    什么是多线程?   线程是指程序运行的流程,多线程则是指可以运行一个以上线程的程序,多线程使程序运行的效率变得更高...

  • 第36节:Java当中的线程

    Java当中的线程 Java当中的线程,进程和线程的关系?进程就是线程吗?不是的。线程的运行,和方法。 多线程和多...

  • 学习

    今天看了imooc的JAVA 多线程运行

网友评论

      本文标题:Java线程的运行流程

      本文链接:https://www.haomeiwen.com/subject/dendqftx.html