1.繼承Thread,重寫run方法。異步
public class MyThread extends Thread { @Override public void run() { int i = 0; while(i < 100){ i++; System.out.println("thread: i = "+i); } } } class Demo{ public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); for (int j = 0; j < 100; j++) { System.out.println("main: j = "+j); } } }
2.實現Runnable接口ide
public class CountTask implements Runnable { @Override public void run() { int i = 0; while(i < 100){ i++; System.out.println("thread: i = "+i); } } } class Demo22{ public static void main(String[] args) { Thread thread = new Thread(new CountTask()); thread.start(); } }
三、實現Callable接口**線程
經過實現Callable接口並重寫call方法,並把Callable實例傳給FutureTask對象,再把FutureTask對象傳給Thread對象。它與Thread、Runnable最大的不一樣是Callable能返回一個異步處理的結果Future對象並能拋出異常,而其餘兩種不能。code
調用Thread類型對象的start()
方法。注意若是調用run()
方法的話,只是簡單的方法調用,而不是開啓一條新的線程。對象
在Thread類的源碼中能夠看到定義瞭如下的線程的狀態繼承
狀態 | 含義 | 詳情 |
---|---|---|
NEW | 新建 | 線程被建立了,但未開始運行 |
RUNNABLE | 可運行 | 調用start()後會變成該狀態。該狀態的線程位於可運行線程池中,變得可運行,等待獲取cpu的執行權 |
BLOCKED | 阻塞 | 代表當前線程(A)正在等待獲取一個鎖 (L),獲取鎖後才能進入或再次進入同步的 代碼塊或方法(即臨界區)。當另外一條持有這個鎖的線程(B),調用了鎖對象(L)的wait()方法後,當前線程(A線程)纔有機會獲取到鎖(L) |
WAITING | 等待 | 當前線程(A)已得到鎖 了,已在臨界區中。當調用了Object.wait()、Thread.join()、LockSupport.park() 等方法(都不包含超時參數)後就會進入到等待狀態。 等待 的含義是當前線程(A)正在等待其它線程(B)執行對應的操做,當前線程才能回到RUNNABLE狀態。好比: A線程調用了Object.wait(),那麼A須要等待B線程調用Object.notify()或Object.notifyAll(),A才能回到RUNNABLE狀態;A線程調用了B線程的join(),代表A須要等待B執行完,才能回到RUNNABLE狀態,纔有機會得到cpu執行權繼續運行代碼。 |
TIMED_WAITING | 等待超時 | 當前線程(A)已得到鎖 了,已在臨界區中。當調用瞭如下方法,就會進入等待超時的狀態(含超時參數):Thread.sleep()、Object.wait()、Thread.join()、LockSupport.parkNanos、LockSupport.parkUntil 。請注意wait和sleep的區別: wait是Object上的方法,sleep是Thread上的方法。wait會釋放鎖,但sleep不會釋放鎖。 |
TERMINATED | 終結 | Thread.run()方法運行完,就進入該狀態 |