я когда-то делал очередь потоков, чтобы исполнять их именно по очереди.
	Код:
	type
  TThreadQueue = class(TObjectQueue)
  private
    FInProgress: Boolean;
    FCurrentThread: TThread;
    procedure OnThreadTerminate(Sender: TObject);
  public
    constructor Create;
    destructor Destroy; override;
    procedure ExecuteThreads;
    procedure TerminateCurrentThread;
    procedure TerminateAllThreads;
    property InProgress: Boolean read FInProgress;
    property CurrentThread: TThread read FCurrentThread;
  end;