public class TestThread extends Thread {
public TestThread(String name) { super(name); }
@Override public void run() {
for (int i = 0; i < 5; i++) {
for (long k = 0; k < 100000000; k++);
System.out.println(getName() + " :" + i);
}
}
public static void main(String[] args) {
new TestThread("阿三").start();
new TestThread("李四").start();
}
}
public class DoSomething implements Runnable {
private String name;
public DoSomething(String name) { this.name = name; }
@Override public void run() {
for (int i = 0; i < 5; i++) {
for (long k = 0; k < 100000000; k++);
System.out.println(name + ": " + i);
}
}
}
public class TestRunnable {
public static void main(String[] args) {
new Thread(new DoSomething("阿三")).start();
new Thread(new DoSomething("李四")).start();
}
}
Runnable 方式解耦任務與執行緒控制,支援多執行緒共享同一任務實例。
start():啟動新執行緒,建立新呼叫棧,執行 run()run():不會建立新執行緒,單純方法呼叫main,子執行緒預設 Thread-0、Thread-1...Thread.currentThread()start() 拋出 IllegalThreadStateException
呼叫 t.start() 時,程式分支出新呼叫棧 B,棧 A、B 並行執行。方法調用與執行緒啟動的本質區別在於是否建立新棧。

start()start() 後,等待 CPU 調度run()sleep()、wait()、I/O 等待、鎖等待)run() 結束或異常終止,不可復生try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); }
Thread t = new MyThread();
t.start();
// 主執行緒等待 t 結束
t.join(); // 無限等待
t.join(5000); // 最多等待 5 秒

Thread.NORM_PRIORITY)Thread.sleep() - 睡眠指定時間Thread.yield() - 讓步(無保證)join() - 等待其他執行緒終止(有保證)run() 正常結束wait()(非執行緒方法)參考文章 168771《Java 執行緒池應用》,核心要點:
Executors.newFixedThreadPool(n):固定大小,無界隊列Executors.newCachedThreadPool():動態伸縮,SynchronousQueueExecutors.newSingleThreadExecutor():單執行緒循序執行Executors.newScheduledThreadPool(n):定時/週期任務shutdown() vs shutdownNow():優雅關閉 vs 強制中斷