1. 程式人生 > >java中有幾種方法可以實現一個執行緒?用什麼關鍵字修飾同步方法? stop()和suspend()方法為何不推薦使用?

java中有幾種方法可以實現一個執行緒?用什麼關鍵字修飾同步方法? stop()和suspend()方法為何不推薦使用?

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)形式,第一種直接呼叫threadrun方法,所以,我們往往使用Thread子類,即new SubThread()。第二種呼叫runnablerun方法。

有兩種實現方法,分別是繼承Thread類與實現Runnable介面 

synchronized關鍵字修飾同步方法 

反對使用stop(),是因為它不安全。它會解除由執行緒獲取的所有鎖定,而且如果物件處於一種不連貫狀態,那麼其他執行緒能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。

suspend()方法容易發生死鎖。呼叫suspend()的時候,目標執行緒會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何執行緒都不能訪問鎖定的資源,除非被"掛起"的執行緒恢復執行。對任何執行緒來說,如果它們想恢復目標執行緒,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用suspend(),而應在自己的Thread類中置入一個標誌,指出執行緒應該活動還是掛起。若標誌指出執行緒應該掛起,便用wait()命其進入等待狀態。若標誌指出執行緒應當恢復,則用一個notify()重新啟動執行緒。