1. A maneira certa e errada de alcançar
/**
* 描述:对比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();
}
}
Os resultados da execução do código são mostrados a seguir, o que mostra que a maneira correta de iniciar uma thread é chamar o método start.
当前线程名:main
当前线程名:Thread-0
2. O significado do método de início
- Comece um novo tópico. Solicite à JVM que inicie a tarefa do thread filho, deve-se observar que após a execução do método start, a tarefa do thread pode não ser executada imediatamente e quando é executada depende do agendamento da JVM.
- Pronto para trabalhar. Deixe o thread no estado pronto, prepare todos os recursos, exceto os direitos de execução da CPU, como a memória e o contexto do tempo de execução do programa.
- O método de inicialização não pode ser executado repetidamente. Antes de executar o método de inicialização, você precisa verificar o estado do thread. Se não for 0, a exceção de estado do thread IllegalThreadStateException será lançada.
3. iniciar o código-fonte do método
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();
}