轉自:https://www.cnblogs.com/lwbqqyumidi/p/3804883.html

new MyThread()start(),等待 CPU 調度run(),就緒是唯一入口wait()等待阻塞、synchronized同步阻塞、sleep()/join()/I/O其他阻塞run() 正常結束或異常退出class MyThread extends Thread {
public void run() { for(int i=0;i<100;i++) System.out.println(getName()+i); }
}
new MyThread().start();
class MyRunnable implements Runnable {
public void run() { for(int i=0;i<100;i++) System.out.println(Thread.currentThread().getName()+i); }
}
new Thread(new MyRunnable()).start();
call() 有返回值,FutureTask 實現 RunnableFuture 可作 target 又可獲取結果。
Callable<Integer> c = () -> { int sum=0; for(int i=0;i<100;i++) sum+=i; return sum; };
FutureTask<Integer> ft = new FutureTask<>(c);
new Thread(ft).start();
Integer result = ft.get(); // 阻塞直到完成
注意:同一 Thread 對象不能重複調用 start()。
yield() 或失去 CPUyield() 後 CPU 可能再次調度同一線程。
推薦 volatile boolean stop 標誌位,run() 中判斷快速退出。
class MyRunnable implements Runnable {
private volatile boolean stop = false;
public void run() { for(int i=0;i<100 && !stop;i++) ... }
public void stopThread() { stop = true; }
}