Thread構造方法與啟動

2021-10-11 05:21:32 字數 4843 閱讀 2249

執行緒類一共有八種構造方法

public

thread()

public

thread

(runnable target)

public

thread

(threadgroup group, runnable target)

public

thread

(string name)

public

thread

(threadgroup group, string name)

public

thread

(runnable target, string name)

public

thread

(threadgroup group, runnable target, string name)

/** * 分配乙個新的thread物件,並傳入乙個target作為其執行物件,將指定執行緒名name,

* 以及所屬執行緒組group ,並具有指定的堆疊大小stacksize 。

* 堆疊大小是虛擬機器為該執行緒的堆疊分配的大致的位址空間位元組數。

* stacksize引數的(如果有的話)與平台有關。

*執行緒棧的大小,這個值一般是cpu頁面的整數倍。如x86的頁面大小是4kb。在x86平台下,預設的執行緒棧大小是 12kb。

* 在某些平台上,指定了乙個較高的值stacksize引數可以允許丟擲乙個前乙個執行緒來實現更大的遞迴深

* 度stackoverflowerror 。 類似地,指定較低的值可能允許更多數量的執行緒同時存在,而不會丟擲

* outofmemoryerror (或其他內部錯誤)。 所述stacksize引數的值和最大遞迴深度和併發水平之間

* 的關係的細節是依賴於平台的。 在某些平台上,該值stacksize引數可能沒有任何效果。

** stacksize引數只是被當作一種建議大小傳入虛擬機器。 如果平台的指定值不合理地低,虛擬機器可能會改為

* 使用一些平台特定的最小值; 如果指定的值不合理地高,虛擬機器可能會使用一些平台特定的最大值。

* 同樣,虛擬機器可以自由地按照合適的方式向上或向下捨入指定的值(或完全忽略它)。

** 由於此建構函式的行為有依賴於平台的性質,因此在使用時應特別小心。 執行給定計算所需的執行緒棧大小

* 可能會因jre實現而異。 鑑於這種變化,可能需要仔細調整堆疊大小引數,並且可能需要對要執行應用程式

* 的每個jre實現重複調整。

*/public

thread

(threadgroup group, runnable target, string name,

long stacksize)

當採用new方式建立乙個執行緒物件時,執行緒構造器會呼叫乙個**init()**方法來進行初始化。

/**

* initializes a thread with the current accesscontrolcontext.

* 使用當前的accesscontrolcontext初始化執行緒,八種構造方法都會先進入到這裡

*/private

void

init

(threadgroup g, runnable target, string name,

long stacksize)

/** * 初始化乙個執行緒

* @param g 執行緒組

* @param target 呼叫run()方法的物件

* @param name 執行緒名

* @param stacksize 新執行緒的所需堆疊大小,0表示該引數將被忽略。

* @param acc 要繼承的accesscontrolcontext;如果為null,則為 accesscontroller.getcontext()

* @param inheritthreadlocals 如果為true,則從構造執行緒繼承可繼承執行緒區域性變數的初始值

*/private

void

init

(threadgroup g, runnable target, string name,

long stacksize, accesscontrolcontext acc,

boolean inheritthreadlocals)

this

.name = name;

//給執行緒名賦值

thread parent =

currentthread()

;//獲取當前執行緒

securitymanager security = system.

getsecuritymanager()

;//獲取系統安全管理者

if(g == null)

/* 如果此時執行緒組g還是null會採用當前執行緒的執行緒組。*/

if(g == null)

}//對執行緒組g進行檢查

//主要檢查:1.是否執行緒組為null 2.是否根執行緒組,如果是根執行緒組則要檢查其是否有修改許可權

g.checkaccess()

;//許可權檢查:子類不能覆蓋對安全性敏感的方法,否則將檢查「enablecontextclassloaderoverride」執行時許可權

if(security != null)

} g.

addunstarted()

;//增加執行緒組中未啟動執行緒的數量

this

.group = g;

//為執行緒組賦值

this

.daemon = parent.

isdaemon()

;//將當前執行緒是否是守護執行緒的屬性賦予新建立的執行緒

this

.priority = parent.

getpriority()

;//將當前執行緒的執行優化級的屬性賦予新建立的執行緒

//將當前執行緒的上下文類載入器的屬性賦予新建立的執行緒

if(security == null ||

isccloverridden

(parent.

getclass()

))this

.contextclassloader = parent.

getcontextclassloader()

;else

this

.contextclassloader = parent.contextclassloader;

this

.inheritedaccesscontrolcontext =

acc != null ? acc : accesscontroller.

getcontext()

;//接入控制

this

.target = target;

//為runnable例項賦值

setpriority

(priority)

;//設定執行緒優先順序

//設定inheritablethreadlocals屬性

if(inheritthreadlocals && parent.inheritablethreadlocals != null)

this

.inheritablethreadlocals =

threadlocal.

createinheritedmap

(parent.inheritablethreadlocals)

;this

.stacksize = stacksize;

//設定棧大小

tid =

nextthreadid()

;//設定執行緒id(此方法已加鎖)

}

啟動執行緒

/**

*呼叫此方法,這個執行緒開始執行,jvm虛擬機會呼叫run()方法

* 乙個執行緒被啟動多次是不合法的

* 特別是,執行緒一旦完成執行就可能不會重新啟動。

*/public

synchronized

void

start()

finally

}catch

(throwable ignore)}}

private

native

void

start0()

;//本地方法,真正啟動執行緒的方法

總結:讓執行緒物件呼叫start()方法和run()方法的區別。

執行緒是一條按照順序執行的任務流程。無論是單執行緒還是多執行緒,每條執行緒中的任務都必須按順序完成。

如果現在我們希望有些任務能夠同時執行,那必須把它們分別放在不同的執行緒中。

想要實現多執行緒同時執行的效果,必須要有乙個行為能夠開啟新的執行緒。

run()方法本身沒有特殊功能。如果直接呼叫run()方法,並沒有開啟新的執行緒。就和我們之前呼叫乙個add()、setname()、getage()、sayhello()等等方法是同樣的效果。只是在main這一條執行緒中,進入到了另外乙個方法的執行。那麼就必須要等這個方法中所有的**全部執行完畢,才會返回到呼叫處繼續執行後邊的**。

如果呼叫start()方法,會間接呼叫start()中乙個名為strat0()的native方法,在start0()的底層實現過程中,才會真正開啟另外一條執行緒。這條執行緒會呼叫我們執行緒物件的run()方法。start()方法可以理解為是一種短暫性、瞬時性的方法。只需要將執行緒開啟,把它丟到一旁去自己執行,而start()就算是執行結束了,並不需要等這條執行緒結束。

構造方法與方法

size large b align center 構造方法知識總結 align b size size medium 1.構造方法的特點,1 任何乙個類在定義時,系統會預設乙個無參的構造方法,即 public student 2 構造方法的唯一作用就是來建立物件 3 構造方法不用宣告返回值型別,但...

構造方法與this

特點 與類名相同 沒有返回值 有乙個系統預設生成的無參構造方法,可進行過載 public class test 構造方法的過程 test t new test 表示有乙個test型別的變數t,new test表示建立乙個物件,將此物件存入t中。此時,有乙個棧記憶體t被開闢成功,new test 呼叫...

構造方法與this

一 構造方法例項及解釋 注意 當宣告有引數的構造器後,無參構造器就被覆蓋了 二 物件建立的流程分析 注意 一般看物件屬性的結果,首先看建構函式中的情況 其它地方的賦值會被覆蓋 三 注意 this關鍵字可有效避免類的屬性和區域性變數重名而導致錯誤 四 super 五 super與this 注意 thi...