溫馨提示×

c# threadlocal如何處理線程中斷

c#
小樊
88
2024-11-27 00:29:35
欄目: 編程語言

在C#中,ThreadLocal類用于在每個線程中存儲線程特定的數據。然而,ThreadLocal本身并不能直接處理線程中斷。線程中斷是通過調用Thread.Interrupt()方法來設置的,當線程處于阻塞狀態(如等待I/O操作完成)時,調用此方法會引發InterruptedException異常。

要在ThreadLocal中處理線程中斷,您需要在每個線程中處理InterruptedException異常。這通常是通過在一個循環中捕獲異常并檢查中斷狀態來實現的。下面是一個示例:

using System;
using System.Threading;

class Program
{
    private static readonly ThreadLocal<int> threadLocal = new ThreadLocal<int>();

    static void Main()
    {
        Thread thread1 = new Thread(Thread1);
        Thread thread2 = new Thread(Thread2);

        thread1.Start();
        thread2.Start();

        thread1.Join();
        thread2.Join();
    }

    static void Thread1()
    {
        while (!Thread.CurrentThread.IsInterrupted)
        {
            try
            {
                // 模擬一些工作
                Thread.Sleep(1000);

                // 設置ThreadLocal值
                threadLocal.Value = 42;
                Console.WriteLine($"Thread1: {threadLocal.Value}");
            }
            catch (InterruptedException ex)
            {
                // 處理中斷異常
                Console.WriteLine("Thread1: Interrupted");
                Thread.ResetInterrupt(); // 重置中斷狀態
                break;
            }
        }
    }

    static void Thread2()
    {
        while (!Thread.CurrentThread.IsInterrupted)
        {
            try
            {
                // 模擬一些工作
                Thread.Sleep(1000);

                // 設置ThreadLocal值
                threadLocal.Value = 99;
                Console.WriteLine($"Thread2: {threadLocal.Value}");
            }
            catch (InterruptedException ex)
            {
                // 處理中斷異常
                Console.WriteLine("Thread2: Interrupted");
                Thread.ResetInterrupt(); // 重置中斷狀態
                break;
            }
        }
    }
}

在這個示例中,我們創建了兩個線程,每個線程都有自己的ThreadLocal實例。在每個線程的工作循環中,我們捕獲InterruptedException異常并處理它。如果線程被中斷,我們會重置中斷狀態并退出循環。這樣,您就可以在ThreadLocal中處理線程中斷了。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女