A thread is an independent path of execution within a process, scheduled by the OS onto a CPU core. In Java a platform thread is a thin wrapper (java.lang.Thread) over an OS thread; you describe the work as a Runnable or Callable, hand it to a thread or an executor, and the scheduler runs it concurrently with everything else. This topic is the vocabulary — start vs run, the six states, daemons, interruption — that every other concurrency topic assumes you already own.
Threads vs the work they run
Keep two ideas separate: the thread (a scheduling unit, expensive, one-shot) and the task (a Runnable/Callable, cheap, reusable). Subclassing Thread couples the two and is discouraged; passing a Runnable — or better, submitting to an ExecutorService — keeps the task independent of how it's scheduled. Creating threads by hand is fine for learning but rare in production: pools and, since Java 21, virtual threads (JEP 444) are what you reach for.
Thread t = new Thread(() -> System.out.println("hi from " + Thread.currentThread()));
t.start(); // schedules the thread; run() executes on the NEW thread
t.join(); // current thread waits for t to finish
The lifecycle
A thread moves through six states defined in the Thread.State enum: NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, and TERMINATED. It starts NEW, becomes RUNNABLE on start(), and ends TERMINATED when run() returns. The middle states reflect why it isn't currently making progress.
NEW --start()--> RUNNABLE RUNNABLE --enter synchronized (lock held)--> BLOCKED RUNNABLE --wait()/join()/park()--> WAITING RUNNABLE --sleep(t)/wait(t)--> TIMED_WAITING BLOCKED/WAITING/TIMED_WAITING --reacquire/notify/timeout--> RUNNABLE RUNNABLE --run() returns--> TERMINATED
Stopping is cooperative
There is no safe way to forcibly kill a thread — Thread.stop() is deprecated for removal because it could leave shared state half-updated. Instead Java uses cooperative interruption: one thread sets the target's interrupt flag, and the target is responsible for noticing it and unwinding. Daemon threads are the one exception to clean shutdown — the JVM exits when only daemons remain, abandoning them mid-run.