第四十一讲 深入线程(操作线程的,执行,挂起,恢复,关闭 及 Join的用法)

来源:互联网 发布:自然哲理 知乎 编辑:程序博客网 时间:2024/05/29 16:26
主要内容
    1. Thread类
        先引用空间名System.Threading
        语法:
        Thread 线程实例名=new Thread(new ThreadStart(方法名));
        
        线程实例名.Start();
        
        Thread类有几个至关重要的方法:
            1. Start()
            2. Sleep(int)
            3. Abort()
            4. Suspend
            5. Resume()
            
        在创建托管的线程时,在该线程上执行的方法将通过一个传递给Thread构造函数的ThreadStart委托或ParameterizedThreadStart委托来表示
        Thread(ParameterizedThreadStart):初始化Thread类的新实例,指定允许对象在线程启动时传递给线程的委托。
        
        Thread(ThreadStart):使用ThreadStart类型的参数,初始化Thread类的新实例。
        
        public delegate void ParameterizedThreadStart(object obj)
        
        public delegate void ThreadStart()
        
        
    2. 线程的挂起与恢复
        临时挂起会话进程(用户通常不会这么做,但这仅是一个示例,在更真实的示例中,用户可能是暂停声音文件或视频文件的播放)
        主线程中挂起线程如:
            线程实例名.Suspend();
        恢复线程,如:
            线程实例名.Resume();
            
            
    3. 终止线程
        如需要退出该线程,如:
            线程实例名.Abort();
        如果后续的处理依赖于另一个已经中止的线程,可以调用join()方法,等待线程终止,如:线程实例名.Abort();
            线程实例名.Join();
            
        Join()方法:当前线程调用另的线程Join时,当前线程就会进入等待状态,等待调用线程完成操作后,当前线程才能继续执行。
        

        Join方法有两个版本,一个是不带参数的,调用如:Join(),一种是带有时间参数的,调用如:Join(20),此时Join的方法里面的时间表示当前线程最多能等待调用 线程的毫秒数,如果超过这个时间,那么当前线程就不等了继续往下执行。


操作线程的,执行,挂起,恢复,和关闭

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace Con41{    class Program    {        static void Main(string[] args)        {            //如果你多测试几下,你会发现一个现象,除主线程外,的其它辅助线程的执行顺序有时会乱            Console.WriteLine("我是主线程,我就是默认的线程,老大就是我了!\n");            Thread.Sleep(500);//如果我每个线程之间都加一点延时呢            Instance instance=new Instance();            Thread newThread = new Thread(instance.noneInstance1);            newThread.Start();            newThread = new Thread(instance.noneInstance2);            newThread.Start("我是有参数的实例方法");            newThread = new Thread(Instance.noneStatic1);            newThread.Start();            newThread = new Thread(Instance.noneStatic2);            newThread.Start("我是有参数的静态方法");            Thread.Sleep(1000);//如果我每个线程之间都加一点延时呢            Console.WriteLine("\n******************下面的实例跟上面相同的结果**************\n");            newThread = new Thread(new ThreadStart(instance.noneInstance1));//这个跟第一个相同            newThread.Start();            //但是使用ParameterizedThreadStart这个委托来调用无参数的实例方法            //newThread = new Thread(new ParameterizedThreadStart(instance.noneInstance1));            //因为这个委托系统定义是带参数的,相对来说上面那个ThreadStart这个委托系统定义是无参数的            newThread = new Thread(new ParameterizedThreadStart(instance.noneInstance2));            newThread.Start("ParameterizedThreadStart这个委托系统定义时是带参数的。我是实例方法");            //上面两个现象应用静态方法是同理的            newThread = new Thread(new ThreadStart(Instance.noneStatic1));//这个跟第三个相同            newThread.Start();            newThread = new Thread(new ParameterizedThreadStart(Instance.noneStatic2));            newThread.Start("ParameterizedThreadStart这个委托系统定义时是带参数的。我是静态方法");            Thread.Sleep(2500);//如果我每个线程之间都加一点延时呢            Console.WriteLine("\n******************测试一下挂起和恢复**************\n");            Thread Test = new Thread(threadTtest);            Thread Test2 = new Thread(threadTest2);            Test.Start(Test);//Test开始执行            Thread.Sleep(1000);//一秒后观察Test状态            Console.WriteLine("Test当前线程的状态是:{0}", Test.ThreadState.ToString());            Test2.Start(Test2);//在test挂起时执行test2            Thread.Sleep(500);//0.5秒后恢复Test            Test.Resume();//test恢复执行            //观察Test2的状态            Console.WriteLine("Test2当前线程的状态是:{0}", Test2.ThreadState.ToString());            Thread.Sleep(1000);//一秒后观察Test 和 Test2的状态            Console.WriteLine("Test当前线程的状态是:{0}", Test.ThreadState.ToString());            Console.WriteLine("Test2当前线程的状态是:{0}", Test2.ThreadState.ToString());            //恢复Test2            Test2.Resume();            Thread.Sleep(500);//0.5秒后再观察Test2的状态            Console.WriteLine("Test2当前线程的状态是:{0}", Test2.ThreadState.ToString());            Console.ReadKey();        }        public static void threadTtest(object o)        {            Thread t = o as Thread;            Console.WriteLine("Test当前线程的状态是:{0}",t.ThreadState.ToString());            for (int i = 0; i < 20; i++)            {                Console.WriteLine(i);                if (i == 10)                {                    t.Suspend();//挂起当前线程                                    }            }        }        public static void threadTest2(object o)        {            Thread t = o as Thread;            Console.WriteLine("Test2当前线程的状态是:{0}", t.ThreadState);            for (int i = 0; i < 20; i++)            {                Console.WriteLine(i);                if (i == 10)                {                    t.Suspend();//挂起当前线程                }                else if (i == 15)                {                    t.Abort();//关闭TEst2线程                }            }        }    }    /// <summary>    /// 一个实例类    /// </summary>    public class Instance    {        public void noneInstance1()        {            Thread.Sleep(500);//如果我每个线程之间都加一点延时呢            Console.WriteLine("我是新线程中无参数的实例方法\n");        }        public void noneInstance2(object str)        {            Thread.Sleep(600);//如果我每个线程之间都加一点延时呢            Console.WriteLine("我是新线程中有参数的实例方法,我携带的参数内容是:{0}\n",str);        }                public static void noneStatic1()        {            Thread.Sleep(700);//如果我每个线程之间都加一点延时呢            Console.WriteLine("我是新线程中无参数的静态方法\n");        }        public static void noneStatic2(object str)        {            Thread.Sleep(800);//如果我每个线程之间都加一点延时呢            Console.WriteLine("我是新线程中带参数的静态方法,我携带的内容是:{0}\n",str);        }    }}


补充Join的用法:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace Con412{    class Program    {        //定义两个全局线程变量        static Thread t1;        static Thread t2;        static void Main(string[] args)        {            t1 = new Thread(t1Test);            t2 = new Thread(t2Test);            t1.Start();            t2.Start();            Console.ReadKey();        }        public static void t1Test()        {            for (int i = 0; i < 5; i++)            {                Console.WriteLine(i+"-->A");                if (i >= 2)                {//这里在调示时有一现象,当我设置大于等时,执行的结果并不是我要的结果                    //只有i==2时才能成功显示预想的结果                    t2.Join();                }            }        }        public static void t2Test()        {            for (int i = 0; i < 5; i++)            {                Console.WriteLine(i+"-->B");            }        }    }}



0 0
原创粉丝点击