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

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

java5以前,有兩種實現方法,分別使用new Thread()和new Thread(runnable)形式,第一種繼承Thread類,直接呼叫thread的run方法,所以,我們往往使用Thread子類,即new SubThread()。第二種是實現Runnable介面,呼叫runnable的run方法。

第一種: 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開始,還有如下一些執行緒池建立多執行緒的方式:

newFixedThreadPool(int nThread):

建立一個可重用固定執行緒數的執行緒池,以共享的無界佇列方式來執行這些執行緒。

ExecutorService pool = Executors.newFixedThreadPool(3)
    for(int i=0;i<10;i++) {
        pool.execute(new Runable(){public void run(){}});
    }

newCachedThreadPool():
建立一個可根據需要建立新執行緒的執行緒池,但是在以前構造的執行緒可用時將重用它們。

Executors.newCachedThreadPool().execute(new
Runable(){public void run(){}}); newSingleThreadExecutor():
 **建立一個使用單個 worker 執行緒的 Executor,以無界佇列方式來執行該執行緒。**
Executors.newSingleThreadExecutor().execute(new Runable(){public void run(){}});

用synchronized關鍵字修飾同步方法。
反對使用stop(),是因為它不安全。它會解除由執行緒獲取的所有鎖定,而且如果物件處於一種不連貫狀態,那麼其他執行緒能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。suspend()方法容易發生死鎖。呼叫suspend()的時候,目標執行緒會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何執行緒都不能訪問鎖定的資源,除非被”掛起”的執行緒恢復執行。對任何執行緒來說,如果它們想恢復目標執行緒,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用suspend(),而應在自己的Thread類中置入一個標誌,指出執行緒應該活動還是掛起。若標誌指出執行緒應該掛起,便用wait()命其進入等待狀態。若標誌指出執行緒應當恢復,則用一個notify()重新啟動執行緒。

多執行緒有幾種實現方法?同步有幾種實現方法?
多執行緒有兩種實現方法,分別是繼承Thread類與實現Runnable介面
同步的實現方面有兩種,分別是synchronized,wait與notify
wait():使一個執行緒處於等待狀態,並且釋放所持有的物件的lock。
sleep():使一個正在執行的執行緒處於睡眠狀態,是一個靜態方法,呼叫此方法要捕捉InterruptedException異常。
notify():喚醒一個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並不能確切的喚醒某一個等待狀態的執行緒,而是由JVM確定喚醒哪個執行緒,而且不是按優先順序。
notityAll():喚醒所有處入等待狀態的執行緒,注意並不是給所有喚醒執行緒一個物件的鎖,而是讓它們競爭。