**自:
當執行緒物件的execute()執行完畢,我們就認為此執行緒終止了。這時候,它會呼叫delphi的乙個標準例程endthread(),這個例程再呼叫api函式exitthread()。由exitthread()來清除執行緒所占用的棧。
當結束使用tthread物件時,應該確保已經把這個delphi物件從記憶體中清除了。這才能確保所有記憶體占有都釋放掉。儘管在程序終止時會自動清除所有的執行緒物件,但是及時清除已經不再使用的物件,可以使記憶體的使用效率提高。利用將freeonterminate的屬性設定為true的方法來及時清除執行緒物件時最方便的方法,這只需要在execute()退出之前設定就行了。設定的方法如下12
3456
78procedure
ttestthread
.
execute;
var
i:
integer
;
begin
freeonterminate:=
true
;
for
i:=
1
to
2000000
do
inc(answer, round(
abs
(sin(sqrt(i)))));
end
;
這樣,當乙個執行緒終止的時候,就會觸發onterminate事件,就會有機會在事件處理過程中清除執行緒物件了。12
3456
78910
1112
procedure
ttestthread
.
execute;
var
i:
integer
;
begin
freeonterminate:=
true
;
for
i:=
1
to
2000000
do
begin
if
terminated
then
break;
inc(answer, round(
abs
(sin(sqrt(i)))));
end
;
end
;
注意,在某些緊急情況下,你可以使用win32 api函式 terminatethread()來終止乙個執行緒。但是,除非沒有別的辦法了,否則不要使用它。例如,當執行緒**陷入死迴圈中。terminatethread()的宣告如下
1function
terminatethread(hthread: thandle; dwexitcode: dword);
tthread的handle屬性可以作為第乙個引數,因此,terminatethread()常這樣呼叫
1terminatethread(myhosedthread
.
handle,
0
);
如果選擇這個函式,應該考慮到它的負面影響。首先,此函式在windows nt與在windows95/98下並不相同。在windows95/98下,這個函式能夠自動清除執行緒所占用的棧;而在windows nt下,在程序被終止前棧仍被保留。其次,無論執行緒**中是否有try...finally塊,這個函式都會使執行緒立即終止執行。這意味著,被執行緒開啟的檔案沒有被關閉、由執行緒申請的記憶體也沒有被釋放等情況。而且,這個函式在終止執行緒的時候也不通知dll,當dll關閉的時候,這也容易出現enti問題
執行緒的終止
1.程序中的任意執行緒呼叫了exit exit 或者 exit,那麼整個程序就會終止。2.如果預設的動作是終止程序,那麼傳送到執行緒的訊號也會終止整個程序。在不終止程序的情況下停止單個執行緒 1.執行緒可以從啟動例程中返回 return 返回值是執行緒的退出碼。2.執行緒可以被同一程序中的其他執行緒...
執行緒 終止執行緒執行
stop 方法 缺點 強制終止會丟資料 不建議使用 public class myfile catch interruptedexception e 5秒後終止執行緒 t.stop 已過時,強制終止會丟資料 class myrunnable implements runnable catch int...
多執行緒 執行緒終止
stop 中止執行緒,並且清除監視器鎖的資訊,可能導致執行緒安全問題。destroy 從未實現過這個方法 public class demo thread.print public class stopthread extends thread catch interruptedexception ...