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メソッドを呼び出すことであることを示しています。
当前线程名:main
当前线程名:Thread-0
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();
}