java runtime_error ai_generated true

java.lang.IllegalThreadStateException

ID: java/illegal-thread-state-exception

Also available as: JSON · Markdown · 中文
85%Fix Rate
82%Confidence
1Evidence
2024-01-10First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
Java 8 active
Java 11 active
Java 17 active
Java 21 active

Root Cause

Thrown when attempting to start a thread that has already been started or when the thread is in an invalid state for the requested operation.

generic

中文

当尝试启动一个已经启动的线程或线程处于请求操作无效状态时抛出。

Official Documentation

https://docs.oracle.com/javase/8/docs/api/java/lang/IllegalThreadStateException.html

Workarounds

  1. 95% success Check the thread's state before starting: `if (thread.getState() == Thread.State.NEW) { thread.start(); }`. This ensures start() is only called once.
    Check the thread's state before starting: `if (thread.getState() == Thread.State.NEW) { thread.start(); }`. This ensures start() is only called once.
  2. 90% success Use a thread pool (e.g., ExecutorService) instead of managing threads manually. Submit tasks to the pool, which handles thread lifecycle correctly.
    Use a thread pool (e.g., ExecutorService) instead of managing threads manually. Submit tasks to the pool, which handles thread lifecycle correctly.
  3. 85% success If restarting is needed, create a new Thread instance for each execution: `thread = new Thread(task); thread.start();`.
    If restarting is needed, create a new Thread instance for each execution: `thread = new Thread(task); thread.start();`.

中文步骤

  1. Check the thread's state before starting: `if (thread.getState() == Thread.State.NEW) { thread.start(); }`. This ensures start() is only called once.
  2. Use a thread pool (e.g., ExecutorService) instead of managing threads manually. Submit tasks to the pool, which handles thread lifecycle correctly.
  3. If restarting is needed, create a new Thread instance for each execution: `thread = new Thread(task); thread.start();`.

Dead Ends

Common approaches that don't work:

  1. 90% fail

    Thread cannot be restarted; the exception indicates a logic error that will recur.

  2. 70% fail

    Synchronization does not prevent calling start() on an already started thread; the check must be explicit.

  3. 80% fail

    Thread.stop() is deprecated and unsafe; it may leave the thread in an inconsistent state.