在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
中处理线程中断了。