小新的技术天地

Make It Works !

博客园 首页 新随笔 联系 订阅 管理

要是一个线程进行到一半,想终止了,怎么办呢?请看代码:

using System;
using System.Threading;

class ThreadTest
{
    
//工作线程的方法
    public static void WorkerThreadMethod1()
    
{
        
//获得当前正在执行的线程对象
        Thread w1 = Thread.CurrentThread;
        w1.Name 
= "工人1号正在工作中";
        
for(int i=1; i<10 ;i++)
        
{
            Thread.Sleep(
400);
            Console.WriteLine(w1.Name);
            
if(i == 4)
            
{
                Console.WriteLine(
"累死我了,不想做了");
                
//终止线程
                w1.Interrupt();
            }

        }

    }


    
public static void Main()
    
{
        
//用于封装工作线程的委托
        ThreadStart worker1 = new ThreadStart(WorkerThreadMethod1);
        
        Console.WriteLine(
"[主函数]开始创建工作线程");
        
        
//新建一个线程实例,使用worker1委托作为参数,说明这个线程执行的是委托worker1封装的方法
        Thread t1 = new Thread(worker1);
        
//启动线程    
        t1.Start();
        
        
//阻塞当前的主线程,直到t1线程终止
        t1.Join();
        
        
        Console.WriteLine(
"[主函数]工作线程结束");
        Console.ReadLine();
    }

}

输出结果是:

[主函数]开始创建工作线程
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
工人1号正在工作中...
累死我了,不想做了
[主函数]工作线程结束

如你所见,Thread.Interrupt()方法就可以让它终止。那么我不想让它终止,只是想让它暂停一下,怎么办呢?只能用Thread.Sleep(...)吗?那样不好控制,还要看时间,真麻烦,那么我们就这样:

using System;
using System.Threading;

class ThreadTest
{
    
//工作线程的方法
    public static void WorkerThreadMethod1()
    
{
        
//获得当前正在执行的线程对象
        Thread w1 = Thread.CurrentThread;
        w1.Name 
= "工人1号正在工作中";
        
for(int i=1; i<10 ;i++)
        
{
            Thread.Sleep(
400);
            
            Console.WriteLine(w1.Name);
        }

        
    }


    
public static void Main()
    
{
        
//用于封装工作线程的委托
        ThreadStart worker1 = new ThreadStart(WorkerThreadMethod1);
        
        Console.WriteLine(
"[主函数]开始创建工作线程");
        
        
//新建一个线程实例,使用worker1委托作为参数,说明这个线程执行的是委托worker1封装的方法
        Thread t1 = new Thread(worker1);
        
//启动线程    
        t1.Start();
        
        Console.WriteLine(
"我要先来,你给我停下!");
        t1.Suspend();
        
for(int i =1; i <6; i++)
        
{
            Thread.Sleep(
400);
            Console.WriteLine(
"这部电影真好看,享受ing");
        }

        Console.WriteLine(
"好了,我做完事了,你开始吧");
        t1.Resume();
        
        t1.Join();
        
        Console.WriteLine(
"[主函数]工作线程结束");
        Console.ReadLine();
    }

}

输出结果是:

[主函数]开始创建工作线程
我要先来,你给我停下!
这部电影真好看,享受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里

如下所示:

//获得当前正在执行的线程对象
        Thread w1 = Thread.CurrentThread;
        w1.Name 
= "工人1号正在工作中";
        w1.Suspend();

 

效果跟本来是一样的

3.当一个线程使用Suspend方法暂停另一个线程时,第一个线程不被锁定。调用立即返回。

另外,无论对一个给定的线程调用多少次Thread.Suspend方法,调用一次Thread.Resume方法就可使线程恢复执行。


 

posted on 2004-12-09 15:28  小新0574  阅读(23357)  评论(2编辑  收藏  举报