多線程程序設計
線程是系統調度的基本單位,是CPU的一條執行路徑。一個應用程序實例至少有一個線程,即程序的基本線程或主線程。用戶可以根據需要同時創建若干個線程,讓一個程序在同一時刻運行多個線路。線程間獨立運行,每個線程都輪流占用CPU的運行時間和資源,即將CPU的時間分片,每一個時間片給不同的線程使用。這樣,操作系統將不斷的將線程掛起、喚醒、再掛起、再喚醒,直至完成整個任務。
當程序在運行時,線程被加載到內存中等待執行。每個線程都可能包含該應用程序的數據、代碼或者其他操作系統的資源。一個線程執行程序的一部分,所有線程都能夠訪問進程的全局變量。
一個采用多線程的應用程序允許同一程序的多個部分同時執行,為程序賦予了並行特性,因而可以執行某些實時性或隨機性很強的操作,提高對CPU的利用率,加快信息處理速度。
1、線程的創建
筆者利用Delphi語言進行了程序的開發和編寫, 該語言的優點之一是它有一整套線程同步方法,可以很方便地使用。
一個進程的主線程是由操作系統自動生成,如果要讓一個主線程創建額外的線程,在WinAPI中,可以調用CreateThread來完成。在Delphi中,所有的線程類可以從TThread類派生得到,如下:
type
OptimizeThread = class(TThread)
private
{ Private declarations }
DocExec:TADOCommand;
CaseID:Integer; //優化方案代碼
protected
procedure Execute; override;
procedure DoAnalyse;virtual;abstract;
end;
這樣,就從線程基類TThread派生了一個自己的OptimizeThread類,並在此類中添加了新的變量和方法。然後,用戶還需要從OptimizeThread類中派生出一個可供使用的線程對象,如下:
ScheOptimizeThread = class (OptimizeThread)
private
count :integer; //記錄航班的分組
protected
procedure DoAnalyse;override;
public
constructor Create(Exec:TADOCommand;CaseID,count:Integer);
end;
2、線程的掛起和恢復
當線程被掛起時,CPU不分配時間片給該線程,線程停止在掛起命令發出時的代碼處,直到被允許繼續進行。想要掛起線程只要調用線程的suspend方法,或者設置線程對象的suspended為True。若要喚醒線程,則只要調用線程的resume方法,或者設置線程對象的suspended為False即可。
3、線程的終止
當線程從Execute()退出時,線程終止,觸發OnTerminate事件,從而清除線程對象。也可以在線程運行過程中,由其他線程控制該線程的退出,這時需要調用線程對象的Terminate方法,並設置該線程對象的Terminate屬性為True。
用多線程實現航班優化編排
航班優化編排考慮的因素多,涉及到的航班數據量大,分析、優化過程較復雜,需要進行大量計算, 同時產生大量中間數據,考慮到各航班之間可以獨立進行分析,我們采取了多線程方法來提高優化速度。
預先將航班分成了三組,用三個線程同時實現。
首先定義了OptimizeThread,並由OptimizeThread派生出ScheOptimizeThread,再分別對OptimizeThread、ScheOptimizeThread中的方法進行定義。
{ OptimizeThread }
procedure OptimizeThread.Execute;
begin
{ Place thread code here }
DoAnalyse;
end;
constructor ScheOptimizeThread.Create(Exec:TADOCommand;CaseID,count:Integer);
begin
docExec:=Exec;
self.CaseID:=CaseID;
self.Sche:=count;
FreeOnTerminate :=True;//線程終止時自動刪除對象
inherited Create(False);
end;
procedure ScheOptimizeThread.DoAnalyse;
begin
docExec.CommandText:=’exec threadtest ’+InttoStr(CaseID)+’ ,’+InttoStr(count);
// 航班優化編排的具體過程,涉及到大量的數據處理,如果把這些數據都調到客戶端,再
// 進行計算,將會增加網絡流量,浪費執行時間,因此在系統中,我們用存儲過程“threadtest”
// 實現,將與數據關系密切的計算直接放在數據所在的節點,計算完畢直接返回結果。
docExec.Execute;
end;
end.
在主程序中可以直接調用
ScheOptimizeThread.Create(Exec:TADOCommand;CaseID,count:Integer);
便可實現多線程的使用。
結束語
在滿足繁雜的運作規定的前提下,使用多線程對航班計劃進行優化編排,可顯著提高優化效率,有助於降低飛行成本,從而提高整個航空公司的飛行運作效益和飛行管理水平,提高航空公司的市場競爭力,具有廣闊的市場應用前景。