多线程程序设计 线程是系统调度的基本单位,是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); |
便可实现多线程的使用。
结束语 在满足繁杂的运作规定的前提下,使用多线程对航班计划进行优化编排,可显著提高优化效率,有助于降低飞行成本,从而提高整个航空公司的飞行运作效益和飞行管理水平,提高航空公司的市场竞争力,具有广阔的市场应用前景。