五 多執行緒深入話題

2021-10-24 14:09:17 字數 2378 閱讀 4513

1、優雅的停止執行緒

在多執行緒操作之中,啟動多執行緒使用的是thread類中的start()方法,而要對多執行緒進行停止處理,在原來的thread類中提供有stop()方法,但此方法在jdk1.2版本之後就已經過期了,不可使用。而除了stop()方法之外,以下幾個方法也被禁用了:

方法方法定義

廢除原因

停止多執行緒

public final void stop​()
這些方法的使用可能導致執行緒的死鎖

銷毀多執行緒

public void destroy​()
掛起執行緒(暫停執行)

public final void suspend​()
恢復執行(恢復掛起的執行緒執行)

public final void resume​()
在不使用上面方法的情況下,我們可以使用另外一種柔和的方式來讓執行緒停止。

範例:執行緒的停止

package cn.demos;

public class threaddemo catch (exception e)

system.out.println(thread.currentthread().getname() + "正在執行,num=" + num++);

}}, "執行執行緒").start();

// 讓執行緒執行200ms

thread.sleep(200);

flag = false;// 停止執行緒

}}

從上面程式可以分析出,整個程式的執行與flag的值有關,執行緒總共執行200ms,而每次執行緒執行一次則休眠50ms,其執行結果為執行4次,利用休眠時間設定執行緒停止執行。

而萬一現在有其他的執行緒去控制這個flag的內容,那麼執行緒的停止會受到影響,程式需要通過對flag值的判斷

來執行。

2、後台守護執行緒

在多執行緒程式裡面,可以進行守護執行緒的定義。假如現在程式裡主線程的程式或者其他執行緒還在執行,那麼守護執行緒將一直存在,並且執行在後台狀態。

而在thread類中提供有如下的守護執行緒的操作方法:

方法定義

設定為守護執行緒

public final void setdaemon​(boolean on)
判斷是否為守護執行緒

public final boolean isdaemon​()
範例:使用守護執行緒

package cn.demos;

public class threaddemo catch (exception e)

system.out.println(thread.currentthread().getname() + "使用者執行緒正在執行,x=" + x);

}}, "使用者執行緒");// 完成核心任務

// 守護執行緒

thread daemothread = new thread(() -> catch (exception e)

system.out.println(thread.currentthread().getname() + "守護執行緒正在執行,x=" + x);

}}, "守護執行緒");// 完成核心任務

// 設定守護執行緒

daemothread.setdaemon(true);

// 先啟動使用者執行緒,然後啟動守護執行緒

usethread.start();

daemothread.start();

}}

從程式執行結果中可以得知,所有的守護執行緒都是圍繞在使用者執行緒的周圍,所以,如果程式執行完畢那麼守護執行緒也會消失。而在整個jvm最大的守護執行緒就是gc執行緒。

程式執行過程中gc執行緒會一直存在,如果程式執行完畢,那麼gc執行緒也將消失。

3、volatile關鍵字

在程式定義中,volatile關鍵字主要是在屬性定義上使用的,即表示此屬性為直接資料操作,而不進行副本的拷貝處理。

在正常進行變數處理的時候往往會經歷如下的步驟:

1)獲取變數原有的資料內容副本;

2)利用副本為變數進行數學計算;

3)將計算後的變數,儲存到原始空間之中;

若,在屬性上追加volatile關鍵字,表示的就是不使用副本,而是直接操作原始變數,相當於節約了:拷貝副本、重新儲存的步驟。

面試題:請解釋volatile與synchronized的區別:

區別volatile

synchronized

1主要在屬性上使用

在**塊與方法上使用的

2無法描述同步的處理,是一種直接記憶體的處理,避免了副本的操作

是實現同步操作的

第五章 多執行緒深入話題

在多執行緒操作之中如果要啟動多執行緒肯定使用的是thread類中的start 方法,而如果對於多執行緒需要進行停止處理,thread類原本提供的有stop方法,但是對於這些方法從jdk1.2之後就已經將其廢除了,而且一直到現在也不再建議使用了,而除了stop 方法之外,還有幾個方法也被禁用了 之所以...

C 深入多執行緒

主線程 th thread.currentthread 現在的執行緒為主執行緒 th.name mainthread set執行緒名字 主線程本身沒有名字 thread1.text th.name get執行緒名字 建立執行緒 建立執行緒 threadstart thread action new ...

多執行緒詳解(五)

生產者 class producer extends thread override public void run 消費者 class consumer extends thread override public void run 產品 class chicken 緩衝區 class synco...