using System; using System.Threading;class A { public void Show() { for (int i = 0; i < 10; i++) { Thread.Sleep(100); Console.WriteLine("n = " + i.ToString()); }
} public void Show1() { for (int i = 10; i < 20; i++) { Thread.Sleep(100); Console.WriteLine("n = " + i.ToString()); } } public void Show2() { for (int i = 20; i < 30; i++) { Thread.Sleep(100); Console.WriteLine("n = " + i.ToString()); } } static void Main(string[] args) { A a = new A(); Thread thr; thr = new Thread(new ThreadStart(a.Show)); thr.Start(); thr = new Thread(new ThreadStart(a.Show1)); thr.Start(); thr = new Thread(new ThreadStart(a.Show2)); thr.Start(); Console.Read(); }} ------------------------------------------ 你跑一下这个 consoleApplication看一下结果
这个可以证明 线程对象被new之后还会继续跑完 因为并没有 Abort 它
TO: 比如我现在有3个任务(a,b,c)都设置在8点整运行,我设置了Thread.Sleep(0);没效果, 任务a 8点整开始运行了,但任务b,c在8点整运行不了,哪怕任务a 启动几秒后也不行,一定要等任务a运行完后,任务b,c才会运行这个应该不会吧..线程就应该是并发的,虽然并不是严格意义上的并发(也就是说A,B,C不可能在同一时刻都在运行),但每个线程都会分有一定的时间片,应该不可能出现你的说"一定要等任务a运行完后,任务b,c才会运行"
to muyanpeng_mail: 是的,但怎么解决下面的问题? 如我前面写的代码,taskList有2个任务(a,b),循环建立新线程分别启动每个任务,但任务a的线程启动后(myThread.Start();),如何使任务b的线程也启动,我在job.RunTask里设置Thread.Sleep(0);没用. 现在的问题是任务a的线程启动后,一直要等任务a完成后才启动任务b的线程
to liujia_0421(): if (!myThread.Join(lastTime)) { myThread.Abort(); } 这段代码的意思是如果这个线程运行超过规定的运行时间,强制关掉此线程
if (null != taskList)
{
DateTime lastMaxTime;
//执行每一个任务
foreach (DataCheckTaskInfo job in taskList)
{
lastMaxTime = job.LastMaxTime; ThreadStart myThreadDelegate = new ThreadStart(job.RunTask);
Thread myThread = new Thread(myThreadDelegate);
//myThread.IsBackground = true;
myThread.Start();
//Thread.Sleep(300);
TimeSpan lastTime = new TimeSpan(lastMaxTime.Hour, lastMaxTime.Minute, lastMaxTime.Second);
if (!myThread.Join(lastTime))
{
myThread.Abort();
} }
}
任务a 8点整开始运行了,但任务b,c在8点整运行不了,哪怕任务a 启动几秒后也不行,一定要等任务a运行完后,任务b,c才会运行
using System.Threading;class A
{
public void Show()
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(100);
Console.WriteLine("n = " + i.ToString());
}
}
public void Show1()
{
for (int i = 10; i < 20; i++)
{
Thread.Sleep(100);
Console.WriteLine("n = " + i.ToString());
}
}
public void Show2()
{
for (int i = 20; i < 30; i++)
{
Thread.Sleep(100);
Console.WriteLine("n = " + i.ToString());
} } static void Main(string[] args)
{
A a = new A();
Thread thr;
thr = new Thread(new ThreadStart(a.Show));
thr.Start();
thr = new Thread(new ThreadStart(a.Show1));
thr.Start();
thr = new Thread(new ThreadStart(a.Show2));
thr.Start();
Console.Read();
}}
------------------------------------------
你跑一下这个 consoleApplication看一下结果
比如我现在有3个任务(a,b,c)都设置在8点整运行,我设置了Thread.Sleep(0);没效果,
任务a 8点整开始运行了,但任务b,c在8点整运行不了,哪怕任务a 启动几秒后也不行,一定要等任务a运行完后,任务b,c才会运行这个应该不会吧..线程就应该是并发的,虽然并不是严格意义上的并发(也就是说A,B,C不可能在同一时刻都在运行),但每个线程都会分有一定的时间片,应该不可能出现你的说"一定要等任务a运行完后,任务b,c才会运行"
{
myThread.Abort();
}
也就是说你启动第一个线程后,执行到这条语句时,它会等待lastTime这么长时间,在这段时间里如果线程执行完,则myThread.Join(lastTime)会返回true,否则返回false,此时你将其"Abort"..不论怎么说每当你开启一个线程执行到这条语句,都会等待lastTime这么长时间,然后才会进行下一次循环,即开启下一条线程,可能在这段时间内,你的第一个线程(a)已经执行完成..由此可见,你所谓的"一定要等任务a运行完后,任务b,c才会运行"的现象不言而喻...
是的,但怎么解决下面的问题?
如我前面写的代码,taskList有2个任务(a,b),循环建立新线程分别启动每个任务,但任务a的线程启动后(myThread.Start();),如何使任务b的线程也启动,我在job.RunTask里设置Thread.Sleep(0);没用. 现在的问题是任务a的线程启动后,一直要等任务a完成后才启动任务b的线程
if (!myThread.Join(lastTime))
{
myThread.Abort();
}
这段代码的意思是如果这个线程运行超过规定的运行时间,强制关掉此线程
这段代码的意思是如果这个线程运行超过规定的运行时间,强制关掉此线程我知道,你不是一直在问为什么"任务a的线程启动后,一直要等任务a完成后才启动任务b的线程"吗?原因就出你的这句代码里了...对于public bool Join (
TimeSpan timeout
)
如果线程已终止,则为 true;如果线程在经过了 timeout 参数指定的时间量后未终止,则为 false。举个例子,循环的第一次你创建了线程a,执行到此语句时,它会检查线程a是否已结束,如果没有结束,它会等待,直到线程a结束,如果等待了lastTime这么长时间,线程a还没有结束,会调用你的myThread.Abort();来强制关掉线程...然后再进行下一次循环,即创建下一个线程b..总之,只有线程a结束后(自动结束,或者被强制关掉),纯程b才会被创建...
如我前面写的代码,taskList有2个任务(a,b),循环建立新线程分别启动每个任务,但任务a的线程启动后(myThread.Start();),如何使任务b的线程也启动,我在job.RunTask里设置Thread.Sleep(0);没用. 现在的问题是任务a的线程启动后,一直要等任务a完成后才启动任务b的线程----------------------------------------------------------------liujia_0421() 说的
刚看了下你的代码,写得确实有点问题:你的本意是根据任务数来循环启动几个线程,但是为什么会出现你所谓的"一定要等任务a运行完后,任务b,c才会运行"?原因就出在:if (!myThread.Join(lastTime))
{
myThread.Abort();
}
也就是说你启动第一个线程后,执行到这条语句时,它会等待lastTime这么长时间,在这段时间里如果线程执行完,则myThread.Join(lastTime)会返回true,否则返回false,此时你将其"Abort"..不论怎么说每当你开启一个线程执行到这条语句,都会等待lastTime这么长时间,然后才会进行下一次循环,即开启下一条线程,可能在这段时间内,你的第一个线程(a)已经执行完成..由此可见,你所谓的"一定要等任务a运行完后,任务b,c才会运行"的现象不言而喻...
--------------------------------------------------------------------------
问题好像就是出在这里
ThreadStart myThreadDelegate = new ThreadStart(job.RunTask);
Thread myThread = new Thread(myThreadDelegate);
myThread.Start();
TimeSpan lastTime = new TimeSpan(lastMaxTime.Hour, lastMaxTime.Minute, lastMaxTime.Second);
if (!myThread.Join(lastTime))
{
myThread.Abort();
}
把上面这些 在写到一个线程里(线程里开线程)
------------------------------------------------------------
这个好像想多了