java5 以前, 有如下兩種:
第一種:
new Thread(){}.start();這表示調用 Thread 子類對象的 run 方法, new Thread(){}表示一個Thread 的匿名子類的實例對象, 子類加上 run 方法后的代碼如下:
new Thread(){ public void run(){ } }.start();
第二種:
new Thread(new Runnable(){}).start();這表示調用 Thread 對象接受的 Runnable 對象的 run方法, new Runnable(){}表示一個 Runnable 的匿名子類的實例對象,runnable 的子類加上 run 方法后的代碼如下:
new Thread(new Runnable(){ public void run(){ } } ).start();
從 java5 開始, 還有如下一些線程池創建多線程的方式:
ExecutorService pool = Executors.newFixedThreadPool(3) for(int i=0;i<10;i++){ pool.execute(new Runable(){ public void run(){ } }); } Executors.newCachedThreadPool().execute(new Runable(){ public void run(){ } }); Executors.newSingleThreadExecutor().execute(new Runable( {public void run(){ } });
有兩種實現方法, 分別使用 new Thread()和 new Thread(runnable)形式, 第一種直接調用
thread 的 run 方法, 所以, 我們往往使用 Thread 子類, 即 new SubThread()。 第二種調
用 runnable 的 run 方法。
有兩種實現方法, 分別是繼承 Thread 類與實現 Runnable 接口
用 synchronized 關鍵字修飾同步方法
為何stop()和suspend()方法不推薦使用???
stop()方法作為一種粗暴的線程終止行為,在線程終止之前沒有對其做任何的清除操作,因此具有固有的不安全性。 用Thread.stop()方法來終止線程將會釋放該線程對象已經鎖定的所有監視器。如果以前受這些監視器保護的任何對象都處於不連貫狀態,那么損壞的對象對其他線程可見,這有可能導致不安全的操作。 由於上述原因,因此不應該使用stop()方法,而應該在自己的Thread類中置入一個標志,用於控制目標線程是活動還是停止。如果該標志指示它要停止運行,可使其結束run()方法。如果目標線程等待很長時間,則應使用interrupt()方法來中斷該等待。
suspend()方法 該方法已經遭到反對,因為它具有固有的死鎖傾向。調用suspend()方法的時候,目標線程會停下來。如果目標線程掛起時在保護關鍵系統資源的監視器上保持有鎖,則在目標線程重新開始以前,其他線程都不能訪問該資源。除非被掛起的線程恢復運行。對任何其他線程來說,如果想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。由於上述原因,因此不應該使用suspend()方法,而應在自己的thread類中置入一個標志,用於控制線程是活動還是掛起。如果標志指出線程應該掛起,那么用wait()方法命令其進入等待狀態。如果標志指出線程應當恢復,那么用notify()方法重新啟動線程。