天天看点

【多线程-Sleep()和Interrup()方法】

一. Sleep()阻塞线程休息方法的使用情况:

Thread.Sleep()方法用于使当前线程暂停指定的时间,然后去执行流程语句。

// 参数: 
        //   millisecondsTimeout:
        //     线程被阻塞的毫秒数。 指定零 (0) 以指示应挂起此线程以使其他等待线程能够执行。 指定 System.Threading.Timeout.Infinite
        //     以无限期阻止线程。
        //
        public static void Sleep(int millisecondsTimeout);
        // 参数: 
        //   timeout:
        //     设置为线程被阻塞的时间量的 System.TimeSpan。 指定零以指示应挂起此线程以使其他等待线程能够执行。 指定 System.Threading.Timeout.Infinite
        //     以无限期阻止线程。
        public static void Sleep(TimeSpan timeout);
           

常用于需要开启一个不停执行某个超做,进行循环时候,需要对Thread进行阻塞,减少计算机资源的消耗,和合理的控制程序逻辑的执行。

private static Thread subthread ;
        static void Main(string[] args)
        {
            Thread.CurrentThread.Name = "Main线程";

            subthread = new Thread(new ThreadStart(GetShow)); //无参数的入口方法线程
            subthread.Start();  //开启线程
            subthread.Name = "无参数的入口方法线程";

            Console.WriteLine("主线程结束");
        }

        static void GetShow()
        {
            while (true)
            {
                Console.WriteLine(Thread.CurrentThread);
                Console.WriteLine("进行数据同步");
                Thread.Sleep(10000);//阻塞10000进行一次数据的同步
            }
        }
           

二. Interrupt() 唤醒休眠中的线程的方法

class Program
    {
        private static Thread subthread ;
        static void Main(string[] args)
        {
            Thread.CurrentThread.Name = "Main线程";

            subthread = new Thread(new ThreadStart(GetShow)); //无参数的入口方法线程
            subthread.Name = "无参数的入口方法线程";
            subthread.Start();  //开启线程
            for (int i = 1; i <= 5; i++)
            {
                 Thread.Sleep(1000);
                 Console.WriteLine("第{0}秒",i);
            }
            subthread.Interrupt();

            Console.WriteLine("主线程结束");
        }

        static void GetShow()
        {
            Console.WriteLine("名称"+Thread.CurrentThread.Name);
            try
            {
                Console.WriteLine("休息十秒");
                Thread.Sleep(10000);
            }
            catch (Exception ex)
            {
                Console.WriteLine("线程被唤醒,只休息了5秒");
                Console.WriteLine(ex.Message);
            }
            Console.WriteLine(Thread.CurrentThread.Name);
        }
    }
           
【多线程-Sleep()和Interrup()方法】

注意:

线程在休眠的那一刻,被唤醒时,Thread.Sleep()方法会抛出异常,所有要用 try { }catch (Exception ex){ }包起来;

线程在没有休眠的那一刻被唤醒,在后面某一端时间休眠后Thread.Sleep()方法会抛出异常,所有进行 try { }catch (Exception ex){ }异常处理,避免程序死掉。