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?
- ¿Por qué mi EditText se expandió horizontalmente o verticalmente después de configurar Width and Height como wrap_content en android?
- ¿Cómo puedo esperar 10 segundos sin bloquear la interfaz de usuario de la aplicación en android
- Tesseract de OCR para Android: uso de datos de objetos Pixa para mostrar cuadros delimitadores
- Error de Jenkins Execute: java.io.IOException ant build
- No se puede mostrar la barra del sistema Android después de ocultar
- ¿Cómo registrar un oyente para el cambio de orientación?
- Java.lang.ClassCastException: org.json.simple.JSONArray no se puede convertir en org.json.JSONArray
- Problemas con https (sin certificado de igual) en android
- ¿Por qué FileOutputStream lanzar FileNotFoundException?
- Android camera2 Error de API en la llamada a createCaptureSession
- Retrofit y Jackson y análisis de JSON
- Lectura de la respuesta HttpPost
- Android: ¿dividido en un salto de línea en String? (Párrafos)
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.
- ¿Por qué el campo PackageInfo.signatures es una matriz y cuándo debería haber algo distinto de un valor aquí?
- Androide retrolambda, la sentencia lambda puede ser reemplazada por la expresión lambda