# multithreading Classic multithreading interview programs in plain Java 25, each runnable and each pinned by a JUnit test with a hard timeout (no `sleep()` is used to synchronise anything). Companion to [Java Multithreading Programs for Interviews](https://ankurm.com/java-multithreading-programs-interview-odd-even-ping-pong-deadlock/). ## Versions | Component | Version | Verified against | |---|---|---| | JDK | 25.0.5+8 (Temurin LTS), `--release 25` | `java -version` | | JUnit Jupiter | 6.1.3 | same version as the other modules in this repo | | Maven | 3.9.11 | `mvn -version` | ## Run it ```bash cd multithreading ./scripts/run.sh odd-even # also: ping-pong | ordered | deadlock | virtual mvn test # 25 tests ./scripts/run-all.sh # regenerates everything in output/ ``` ## Programs | Question | Class | Technique | |---|---|---| | Odd-even printing | `OddEvenWaitNotify`, `OddEvenSemaphore`, `OddEvenLockCondition` | `synchronized`+`wait/notifyAll`; two `Semaphore`s; `ReentrantLock`+2 `Condition`s | | Ping-pong | `PingPong` | `ReentrantLock`+2 `Condition`s, boolean turn flag | | Ordered threads | `OrderedThreads` | `CountDownLatch` chain; `join()` chain; `Semaphore` ring (3 or 1,000 threads) | | Deadlock | `Transfers`, `DeadlockScenario`, `DeadlockDetector` | naive vs lock ordering vs `tryLock(timeout)`; detection by `ThreadMXBean.findDeadlockedThreads` | | Virtual threads | every class takes a `ThreadKind` (`PLATFORM` / `VIRTUAL`) | same code, both thread types | Support: `Group` starts named threads and waits with a deadline (a hang becomes a failing test). ## Captured output (`output/`) | File | What it shows | |---|---| | `01-odd-even.txt` | the three odd-even implementations, 1..10 | | `02-ping-pong.txt` | 4 rounds of ping/pong | | `03-ordered-threads.txt` | T3,T2,T1 started in that order, run T1,T2,T3; round-robin of 3 threads | | `04-deadlock.txt` | real `findDeadlockedThreads` report, both fixes, and virtual threads being invisible to it | | `05-virtual-single-carrier.txt` | wait/notify and 1,000 virtual threads on ONE carrier thread | | `06-test-results.txt` | every test name, pass/fail | ## License MIT, see the repository root.