Java Threading Error IllegalThreadState hilo ya iniciado

Siempre que empiezo mi hilo siempre hago este cheque. No encontré en ninguna parte que llamé comienzo en el hilo sin hacer el cheque abajo

if (!myThread.isAlive()) myThread.start(); 

Sin embargo, termino con IllegalThreadStateException: Thread ya iniciado. Esto realmente se bloquea mi aplicación (android). Así que hay algún otro cheque que tengo que hacer antes de iniciar un hilo?

Debería comprobar si el hilo ya ha empezado a usar getState () e iniciarlo sólo si su estado es nuevo , de lo contrario, cree un nuevo hilo (si es necesario).

¿Creas una nueva instancia para la referencia de myThread usando new? Sólo puede ejecutar myThread.start () una vez en una sola instancia.

Comprobar si está vivo no es el camino correcto. Crear una nueva instancia.

Acabo de tener un caso similar aquí, por eso doy una respuesta tardía.

El problema es que la solución con Thread.isAlive() y Thread.start() no es multithread-safe. Puede ocurrir que un primer subproceso llame a su código, ejecute isAlive() y en algún lugar dentro de Thread.start() , después de que se inició el nuevo subproceso y antes de que cambie el estado, se produce un cambio de tarea y un segundo llamante ejecuta isAlive() cuando lo hace Es aún false haciendo así que start() sea ​​llamado dos veces. Para que sea peor en algún lugar dentro de start() parece que un switch de tarea es forzado y por lo tanto este problema aparece con bastante frecuencia.

Solución: Anule el start() para que sea multithread-safe, por ejemplo

 private final AtomicBoolean started = new AtomicBoolean(false); /* (non-Javadoc) * @see java.lang.Thread#start() */ @Override public synchronized void start() { if (!started.getAndSet(true)) { super.start(); } } 

Entonces su problema no aparecerá más, incluso si start() accidentalmente se llama dos veces.

  • Agrega API de datos de Youtube en Android Studio usando Gradle
  • Leer la secuencia dos veces
  • ¿Por qué recibo "libcore.io.ErrnoException: open failed: ENOENT" al ejecutar una aplicación de IOIO Mint?
  • Dibuja parte de la imagen a la pantalla (sin cargar todo a la memoria)
  • Mostrando error Causado por: java.lang.reflect.InvocationTargetException
  • RecyclerView: Las clases internas no pueden tener una declaración estática
  • ¿Cómo puedo coordinar dos tareas de fondo?
  • Listview se bloquea en modo retrato cuando se hace clic en elementos (con fragmentos)
  • Android: Permiso denegado para / data / local / tmp / *
  • Uso de ECC Curve25519 para cifrar / descifrar datos en Java
  • Error al utilizar notifyDataSetChanged en el adaptador de matriz de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.