3.线程启动
原创
©著作权归作者所有:来自51CTO博客作者wx63560c7d74933的原创作品,请联系作者获取转载授权,否则将追究法律责任
1.正确和错误的实现方式
/**
* 描述:对比start和run两种启动线程的方式。
*/
public class ThreadRunAndStart implements Runnable{
@Override
public void run() {
System.out.println("当前线程名:" + Thread.currentThread().getName());
}
public static void main(String[] args) {
ThreadRunAndStart threadRunAndStart = new ThreadRunAndStart();
threadRunAndStart.run();
Thread thread = new Thread(threadRunAndStart);
thread.start();
}
}
代码运行结果如下所示,由此可知,启动线程的正确方式是调用start方法。
2.start方法的含义
- 启动新线程。请求JVM开启子线程的任务,这里需要注意的是,执行start方法后,线程任务并不一定会被立刻执行,何时被执行取决于JVM的调度。
- 准备工作。使线程处于就绪状态,准备除CPU执行权以外的所有资源,如内存和程序运行时的上下文环境。
- 不能重复执行start方法。执行start方法前,需要检查线程的状态,如果不是0,则会抛出线程状态异常IllegalThreadStateException。
3.start方法源码
public class Thread implements Runnable {
public synchronized void start() {
//1.启动新线程前检查线程状态
if (threadStatus != 0)
throw new IllegalThreadStateException();
//2.加入线程组
group.add(this);
boolean started = false;
try {
//3.调用start0方法
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
//调用本地方法启动线程
private native void start0();
}