天天看點

【多線程-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){ }異常處理,避免程式死掉。