傳統多任務靠作業系統調度多進程,進程擁有獨立環境,耦合度低、並發粒度粗、實現難。近年發展多執行緒技術:單一程式包含多個並發執行緒,共享同一進程位址空間(動態堆、靜態資料區、程式碼),各執行緒僅擁有獨立暫存器與堆疊。優勢:無進程數量限制、切換開銷小、資源共享容易。Windows NT/98 以執行緒為基本調度單位,API 提供執行緒操作介面,IEEE 制定 POSIX 1003.4a 標準。

圖 1 進程之間的關係

圖 2 執行緒之間的關係
執行緒是系統調度基本單位,一個應用程式至少有一個主執行緒。使用者可建立多執行緒,分時佔用 CPU,實現並行特性,提高 CPU 利用率與處理速度。所有執行緒可存取進程全域變數。
Delphi 所有執行緒類別繼承自 TThread。範例建立 OptimizeThread 基類與 ScheOptimizeThread 具體類別:
type
OptimizeThread = class(TThread)
private
DocExec: TADOCommand;
CaseID: Integer; // 優化方案代碼
protected
procedure Execute; override;
procedure DoAnalyse; virtual; abstract;
end;
ScheOptimizeThread = class(OptimizeThread)
private
Count: Integer; // 記錄航班分組
protected
procedure DoAnalyse; override;
public
constructor Create(Exec: TADOCommand; CaseID, Count: Integer);
end;
Suspend 方法或設 Suspended := True。Resume 方法或設 Suspended := False。Execute 返回時自動終止,觸發 OnTerminate 事件清除物件。Terminate 方法並設 Terminated := True 強制結束。航班優化因素多、資料量大、計算複雜、產生大量中間資料。各航班可獨立分析,採多執行緒提速。預先將航班分三組,三個執行緒同時處理。
關鍵實作:
{ OptimizeThread }
procedure OptimizeThread.Execute;
begin
DoAnalyse;
end;
constructor ScheOptimizeThread.Create(Exec: TADOCommand; CaseID, Count: Integer);
begin
DocExec := Exec;
Self.CaseID := CaseID;
Self.Count := Count;
FreeOnTerminate := True; // 終止時自動釋放物件
inherited Create(False); // 立即啟動執行緒
end;
procedure ScheOptimizeThread.DoAnalyse;
begin
DocExec.CommandText := 'exec threadtest ' + IntToStr(CaseID) + ' ,' + IntToStr(Count);
// 航班優化具體過程涉及大量資料處理,若將資料調至客戶端計算會增加網路流量與時間
// 系統採用預存程序 "threadtest" 在資料所在節點直接計算,完成後回傳結果
DocExec.Execute;
end;
主程式只需呼叫 ScheOptimizeThread.Create(Exec, CaseID, Count) 即可啟動多執行緒。
在滿足複雜運作規定前提下,多執行緒優化航班編排可顯著提升效率,降低飛行成本,提升航空公司營運效益與管理水準,增強市場競爭力,應用前景廣闊。