线程的暂停、恢复和终止
2013-10-10 10:04
218 查看
要是一个线程进行到一半,想终止了,怎么办呢?请看代码:
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Threading;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
class ThreadTest
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//工作线程的方法
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static void WorkerThreadMethod1()
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//获得当前正在执行的线程对象
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Thread w1 = Thread.CurrentThread;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
w1.Name = "工人1号正在工作中
![](http://www.cnblogs.com/Images/dot.gif)
";
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
for(int i=1; i<10 ;i++)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Thread.Sleep(400);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine(w1.Name);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if(i == 4)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("累死我了,不想做了");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//终止线程
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
w1.Interrupt();
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static void Main()
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//用于封装工作线程的委托
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ThreadStart worker1 = new ThreadStart(WorkerThreadMethod1);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("[主函数]开始创建工作线程");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//新建一个线程实例,使用worker1委托作为参数,说明这个线程执行的是委托worker1封装的方法
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Thread t1 = new Thread(worker1);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//启动线程
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
t1.Start();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//阻塞当前的主线程,直到t1线程终止
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
t1.Join();
![](http://www.cnblogs.c<br/>4000<br/>om/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("[主函数]工作线程结束");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.ReadLine();
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
输出结果是:
[主函数]开始创建工作线程
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
累死我了,不想做了
[主函数]工作线程结束
如你所见,Thread.Interrupt()方法就可以让它终止。那么我不想让它终止,只是想让它暂停一下,怎么办呢?只能用Thread.Sleep(...)吗?那样不好控制,还要看时间,真麻烦,那么我们就这样:
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Threading;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
class ThreadTest
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//工作线程的方法
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static void WorkerThreadMethod1()
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//获得当前正在执行的线程对象
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Thread w1 = Thread.CurrentThread;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
w1.Name = "工人1号正在工作中
![](http://www.cnblogs.com/Images/dot.gif)
";
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
for(int i=1; i<10 ;i++)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Thread.Sleep(400);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine(w1.Name);
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static void Main()
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//用于封装工作线程的委托
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ThreadStart worker1 = new ThreadStart(WorkerThreadMethod1);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("[主函数]开始创建工作线程");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//新建一个线程实例,使用worker1委托作为参数,说明这个线程执行的是委托worker1封装的方法
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Thread t1 = new Thread(worker1);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//启动线程
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
t1.Start();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("我要先来,你给我停下!");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
t1.Suspend();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
for(int i =1; i <6; i++)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Thread.Sleep(400);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("这部电影真好看,享受ing
![](http://www.cnblogs.com/Images/dot.gif)
");
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("好了,我做完事了,你开始吧");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
t1.Resume();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
t1.Join();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("[主函数]工作线程结束");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.ReadLine();
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
输出结果是:
[主函数]开始创建工作线程
我要先来,你给我停下!
这部电影真好看,享受ing...
这部电影真好看,享受ing...
这部电影真好看,享受ing...
这部电影真好看,享受ing...
这部电影真好看,享受ing...
好了,我做完事了,你开始吧
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
[主函数]工作线程结束
我们用Thread.Suspend方法把指定线程暂停了,然后可以用Thread.Resume方法恢复。
注意一下Sleep方法跟Suspend方法的差异吧:
1.Suspend方法没有参数,被它终止的线程只能被另一个线程恢复执行(同过Thread.Resume方法)。(相对应的,Sleep方法要是传递Timeout.Infinite值,那么不能恢复了,只能让另一个线程调用被暂停线程的Thread.Interrupt方法使它终止)
2.可以在当前执行的线程上或者另一个线程上调用Thread.Suspend方法,而Thread.Sleep方法只能在当前线程上调用。
(所以我们把t1.Suspend()语句去掉,加到WorkerThreadMethod1里
如下所示:
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//获得当前正在执行的线程对象
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Thread w1 = Thread.CurrentThread;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
w1.Name = "工人1号正在工作中
![](http://www.cnblogs.com/Images/dot.gif)
";
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
w1.Suspend();
效果跟本来是一样的
)
3.当一个线程使用Suspend方法暂停另一个线程时,第一个线程不被锁定。调用立即返回。
另外,无论对一个给定的线程调用多少次Thread.Suspend方法,调用一次Thread.Resume方法就可使线程恢复执行。
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Threading;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
class ThreadTest
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//工作线程的方法
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static void WorkerThreadMethod1()
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//获得当前正在执行的线程对象
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Thread w1 = Thread.CurrentThread;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
w1.Name = "工人1号正在工作中
![](http://www.cnblogs.com/Images/dot.gif)
";
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
for(int i=1; i<10 ;i++)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Thread.Sleep(400);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine(w1.Name);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if(i == 4)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("累死我了,不想做了");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//终止线程
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
w1.Interrupt();
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static void Main()
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//用于封装工作线程的委托
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ThreadStart worker1 = new ThreadStart(WorkerThreadMethod1);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("[主函数]开始创建工作线程");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//新建一个线程实例,使用worker1委托作为参数,说明这个线程执行的是委托worker1封装的方法
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Thread t1 = new Thread(worker1);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//启动线程
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
t1.Start();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//阻塞当前的主线程,直到t1线程终止
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
t1.Join();
![](http://www.cnblogs.c<br/>4000<br/>om/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("[主函数]工作线程结束");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.ReadLine();
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
输出结果是:
[主函数]开始创建工作线程
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
累死我了,不想做了
[主函数]工作线程结束
如你所见,Thread.Interrupt()方法就可以让它终止。那么我不想让它终止,只是想让它暂停一下,怎么办呢?只能用Thread.Sleep(...)吗?那样不好控制,还要看时间,真麻烦,那么我们就这样:
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System.Threading;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
class ThreadTest
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//工作线程的方法
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static void WorkerThreadMethod1()
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//获得当前正在执行的线程对象
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Thread w1 = Thread.CurrentThread;
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
w1.Name = "工人1号正在工作中
![](http://www.cnblogs.com/Images/dot.gif)
";
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
for(int i=1; i<10 ;i++)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Thread.Sleep(400);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine(w1.Name);
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static void Main()
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//用于封装工作线程的委托
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ThreadStart worker1 = new ThreadStart(WorkerThreadMethod1);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("[主函数]开始创建工作线程");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//新建一个线程实例,使用worker1委托作为参数,说明这个线程执行的是委托worker1封装的方法
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Thread t1 = new Thread(worker1);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//启动线程
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
t1.Start();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("我要先来,你给我停下!");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
t1.Suspend();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
for(int i =1; i <6; i++)
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Thread.Sleep(400);
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("这部电影真好看,享受ing
![](http://www.cnblogs.com/Images/dot.gif)
");
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("好了,我做完事了,你开始吧");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
t1.Resume();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
t1.Join();
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("[主函数]工作线程结束");
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.ReadLine();
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
输出结果是:
[主函数]开始创建工作线程
我要先来,你给我停下!
这部电影真好看,享受ing...
这部电影真好看,享受ing...
这部电影真好看,享受ing...
这部电影真好看,享受ing...
这部电影真好看,享受ing...
好了,我做完事了,你开始吧
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
[主函数]工作线程结束
我们用Thread.Suspend方法把指定线程暂停了,然后可以用Thread.Resume方法恢复。
注意一下Sleep方法跟Suspend方法的差异吧:
1.Suspend方法没有参数,被它终止的线程只能被另一个线程恢复执行(同过Thread.Resume方法)。(相对应的,Sleep方法要是传递Timeout.Infinite值,那么不能恢复了,只能让另一个线程调用被暂停线程的Thread.Interrupt方法使它终止)
2.可以在当前执行的线程上或者另一个线程上调用Thread.Suspend方法,而Thread.Sleep方法只能在当前线程上调用。
(所以我们把t1.Suspend()语句去掉,加到WorkerThreadMethod1里
如下所示:
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//获得当前正在执行的线程对象
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Thread w1 = Thread.CurrentThread;
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
w1.Name = "工人1号正在工作中
![](http://www.cnblogs.com/Images/dot.gif)
";
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
w1.Suspend();
效果跟本来是一样的
)
3.当一个线程使用Suspend方法暂停另一个线程时,第一个线程不被锁定。调用立即返回。
另外,无论对一个给定的线程调用多少次Thread.Suspend方法,调用一次Thread.Resume方法就可使线程恢复执行。
相关文章推荐
- 线程的暂停、恢复和终止
- 线程的暂停、恢复和终止 --收集别人的博文(只为学习)
- 线程的暂停、恢复和终止
- 线程的暂停、恢复和终止
- java多线程suspend、resume暂停与恢复线程
- Android中的java层的线程暂停和恢复实现
- 线程挂起,恢复与终止
- 如何暂停和终止线程
- Java线程优先级和线程暂停恢复的问题
- Java线程的挂起、恢复和终止
- 有关pthread线程的暂停与恢复的讨论
- Java并发编程之三:线程挂起、恢复与终止的正确方法
- Java并发编程系列之二十九:正确终止与恢复线程(续)
- python 线程的暂停, 恢复, 退出详解及实例
- linux中线程的挂起与恢复(进程暂停)
- Java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)
- 2010-05-23 14:48 Java(6)线程暂停、恢复
- java并发编程(三)--线程挂起、恢复与终止的正确方法
- 猎豹MFC--进程和线程--创建线程AfxBeginThread() SetDlgItemInt()线程暂停继续终止
- 线程的启动暂停和终止