java5 以前, 有如下兩種:
第一種:
new Thread(){}.start();這表示調用 Thread 子類對象的 run 方法, new Thread(){}表示一個Thread 的匿名子類的實例對象, 子類加上 run 方法后的代碼如下:
1 new Thread(){ 2 public void run(){ 3 } 4 }.start();
第二種:
new Thread(new Runnable(){}).start();這表示調用 Thread 對象接受的 Runnable 對象的 run方法, new Runnable(){}表示一個 Runnable 的匿名子類的實例對象,runnable 的子類加上 run 方法后的代碼如下:
1 new Thread(new Runnable(){ 2 public void run(){ 3 } 4 } 5 ).start();
從 java5 開始, 還有如下一些線程池創建多線程的方式:
1 ExecutorService pool = Executors.newFixedThreadPool(3) 2 for(int i=0;i<10;i++){ 3 pool.execute(new Runable(){ 4 public void run(){ 5 } 6 }); 7 } 8 Executors.newCachedThreadPool().execute(new Runable(){ 9 public void run(){ 10 } 11 }); 12 Executors.newSingleThreadExecutor().execute(new Runable( 13 {public void run(){ 14 } 15 });
有兩種實現方法, 分別使用 new Thread()和 new Thread(runnable)形式, 第一種直接調用
thread 的 run 方法, 所以, 我們往往使用 Thread 子類, 即 new SubThread()。 第二種調
用 runnable 的 run 方法。
有兩種實現方法, 分別是繼承 Thread 類與實現 Runnable 接口
用 synchronized 關鍵字修飾同步方法
反對使用 stop(), 是因為它不安全。 它會解除由線程獲取的所有鎖定, 而且如果對象處
於一種不連貫狀態, 那么其他線程能在那種狀態下檢查和修改它們。 結果很難檢查出
真正的問題所在。 suspend()方法容易發生死鎖。 調用 suspend()的時候, 目標線程會停
下來, 但卻仍然持有在這之前獲得的鎖定。 此時, 其他任何線程都不能訪問鎖定的資
源, 除非被"掛起"的線程恢復運行。 對任何線程來說, 如果它們想恢復目標線程, 同
時又試圖使用任何一個鎖定的資源, 就會造成死鎖。 所以不應該使用 suspend(), 而應
在自己的 Thread 類中置入一個標志, 指出線程應該活動還是掛起。 若標志指出線程應
該掛起, 便用 wait()命其進入等待狀態。 若標志指出線程應當恢復, 則用一個 notify()
重新啟動線程