Да, это уже должно быть поточно-ориентированным.Вы можете посмотреть исходный код Thread.java здесь , все важные методы, такие как запуск и т. Д., Синхронизированы.
is_Alive - это собственный метод, реализованный на нижнем уровне, поэтому он дает мгновенный ответ о том, запущен поток или нет, он не синхронизирован, поэтому он может выдавать ложное значение сразу после вызова метода start,Хотя это очень и очень редко.
Однако метод start проверяет переменную-член threadStatus, прежде чем приступить к ее работе, и это изменчивое целое число, то есть оно будет мгновенно обновлено во всех обращающихся потоках.Таким образом, вы можете использовать вызов getState, чтобы проверить, запущен ли поток, а не метод isAlive, чтобы избежать запуска вызова дважды.Я скопировал соответствующие части Thread.java ниже.
/* Java thread status for tools,
* initialized to indicate thread 'not yet started'
*/
private volatile int threadStatus = 0;
...
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
....
public State getState() {
// get current thread state
return sun.misc.VM.toThreadState(threadStatus);
}