zoukankan      html  css  js  c++  java
  • 线程的暂停、恢复和终止 收集别人的博文(只为学习)

    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方法就可使线程恢复执行。

    收集别人的博文 :http://www.cnblogs.com/wdxinren/archive/2004/12/09/74891.html

  • 相关阅读:
    PHP实现栈(Stack)数据结构
    为什么推荐std::string而不是char*
    PHP实现插入排序算法
    OpenCms Application dev-ref
    OpenCMS integration with Spring MVC--reference
    安装opencms时遇到问题及解决方法
    Java ZIP File Example---refernce
    Top 10 Algorithms for Coding Interview--reference
    JVMInternals--reference
    java code to byte code--partone--reference
  • 原文地址:https://www.cnblogs.com/guozhe/p/2960961.html
Copyright © 2011-2022 走看看