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