C# 多线程调度执行控制问题

skyctr 2010-01-28 02:49:03
请问各位大大:
有三个线程T1 ,T2, T3 ,T1与T2 可以并行执行,T3需待T1 ,T2都执行完毕才能执行;
1,T1 ,T2同时执行;
2,T1 ,T2执行完毕,T1 ,T2挂起, T3开始执行;
3,T3执行完毕, 唤醒T1 ,T2 重复步骤 1,2



如何用C# 线程实现以上操作 ?请各位给出见解,谢谢!

...全文
298 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyctr 2010-01-28
  • 打赏
  • 举报
回复
根据SP1234 大哥提供的方案,得出以下测试例子:

class Program
{
int interval = 1000;

bool hasT1 = false;
bool hasT2 = false;

static AutoResetEvent AutoEvn1 = new AutoResetEvent(true);

static AutoResetEvent AutoEvn2 = new AutoResetEvent(true);

static void Main(string[] args)
{
Program p = new Program();
Thread T1= new Thread(new ThreadStart(p.goGetT1));
T1.Start();

Thread T2= new Thread(new ThreadStart(p.goGetT2));
T2.Start();

Thread T3= new Thread(new ThreadStart(p.updateTaobao));
T3.Start();


}

public void goGetT1() //
{
while (true)
{
AutoEvn1.WaitOne();
doT1();
}
}


public void doT1()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("T1 do running ------- " + i);
Thread.Sleep(interval);
}
AutoEvn1.Reset();
this.hasT1 = true;
}




public void goGetT2() //
{
while (true)
{
AutoEvn2.WaitOne();
doT2();
}
}



public void doT2()
{
for (int i = 0; i < 20; i++)
{
Console.WriteLine("T2 in running ------- " + i);
Thread.Sleep(interval);
}

AutoEvn2.Reset();
this.hasT2 = true;
}



public void goT3() //更新淘宝库存
{

while (true)
{
if (this.hasT1 && this.hasT2)
{
//
int i = 1;
while (i < 20)
{
Console.WriteLine("T3 in running ------- " + i);
i++;
Thread.Sleep(500);
}
Console.WriteLine("T3 finished");
Thread.Sleep(500);


this.hasT1 = false;
this.hasT2 = false;

AutoEvn1.Set();
AutoEvn2.Set();
}
}
}


}



请问还有优化的地方或另一更优化的方法不?
  • 打赏
  • 举报
回复
呵呵,还是写错一个字!!




比较笨的阻塞方法,主线程基本上是这样:

var lock1 = new ManualResetEvent(false);
var lock2 = new ManualResetEvent(false);
执行T1并且T1中对lock1执行Set;
执行T2并且T2中对lock2执行Set;
lock1.WaitOne();
lock2.WaitOne();
执行T3;
  • 打赏
  • 举报
回复
var lock1 = new ManualResetEvent(false);
var lock2 = new ManualResetEvent(false);
执行T1并且T1中对lock1执行Set;
执行T2并且T1中对lock2执行Set;
lock1.WaitOne();
lock2.WaitOne();
执行T3;
  • 打赏
  • 举报
回复
比较笨的阻塞方法,主线程基本上是这样:

var lock1 = new ManualResetEvent(false);
var lock2 = new ManualResetEvent(false);
执行T1并且T1中对lock1执行Set;
执行T2并且T1中对lock2执行Set;
lock1.WaitOne();
lock2.WaitOne();
wuxinghuazi 2010-01-28
  • 打赏
  • 举报
回复
用线程池 ThreadPool 他是个静态类 里面有可以自动列队的方法
czhenq 2010-01-28
  • 打赏
  • 举报
回复
WaitHandle
skyctr 2010-01-28
  • 打赏
  • 举报
回复
jiujiang88:
将T1,T2装进一个线程里面,执行完毕再调用T3 ,T3执行完毕就调用那个线程. 如何实现?
线程如何调用另一个线程?
skyctr 2010-01-28
  • 打赏
  • 举报
回复
感谢楼上的回答,各位大大还有见解么?
ztenv 2010-01-28
  • 打赏
  • 举报
回复
信号量通知吧,典型的 生产者/消费者 模式,只不过你的生产者是两个线程,消费者是一个线程,
skyctr 2010-01-28
  • 打赏
  • 举报
回复
楼上能给个大概的代码示例吗?
jiujiang88 2010-01-28
  • 打赏
  • 举报
回复
将T1,T2装进一个线程里面,执行完毕再调用T3,T3执行完毕就调用那个线程.

110,546

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧