using System; using System.Threading;
namespace 多线程1 {
internal class Program
{
private static void Main {string[] args}
{
var backThread =new Thread(Worker);
backThread.IsBackground=true;
backThread.Start();
Console.WriteLine("从主线程退出");
Console.ReadKey();
}
private static void Worker()
{
Thread.Sleep(1000);
Console.WriteLine("从后台线程退出");
}
}
}
通过Thread 类创建了一个线程对象,然后通过设置IsBackground属性来指明该线程为后台线程。如果不设置这个属性,则默认为前台线程。接着调用Start的方法,此时后台线程会执行Worker函数的代码。所以在这个程序中有两个线程,一个是运行Main函数的主线程,一个是运行Worker线程的后台线程。
> 线程的容器-线程池
- 线程池是指用来存放应用程序中要使用的线程集合,可以将它理解为一个存放线程的地方,这种集中存放的方式有利于对线程进行管理。
- 通过线程池来实现多线程
- 要使用线程池的线程,需要调用静态方法ThreadPool.QueueUserWorkItem,以指定线程要调用的方法,该静态方法有两个重载版本:
public static bool QueueUserWorkItem(WaitCallback callBack);
public static bool QueueUserWorkItem(WaitCallback callback,Object state)
这两个方法用于向线程池队列添加一个工作先以及一个可选的状态数据。然后,这两个方法就会立即返回。下面通过实例来演示如何使用线程池来实现多线程编程。
using System; using System.Threading;
namespace 多线程2 {
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"主线程ID={Thread.CurrentThread.ManagedThreadId}");
ThreadPool.QueueUserWorkItem(CallBackWorkItem);
ThreadPool.QueueUserWorkItem(CallBackWorkItem,"work");
Thread.Sleep(3000);
Console.WriteLine("主线程退出");
Console.ReadKey();
}
private static void CallBackWorkItem(object state)
{
Console.WriteLine("线程池线程开始执行");
if (state != null)
{
Console.WriteLine($"线程池线程ID={Thread.CurrentThread.ManagedThreadId},传入的参数为{state.ToString()}");
}
else
{
Console.WriteLine($"线程池线程ID={Thread.CurrentThread.ManagedThreadId}");
}
}
}
}
- 协作式取消线程池线程
- .NET Framework提供了取消操作的模式,这个模式是协作式的。为了取消一个操作,必须创建一个System.Threading.CancellationTokenSource对象。
using System; using System.Threading;
namespace 多线程3 {
internal class Program
{
private static void Main(string[] args)
{
Console.WriteLine("主线程运行");
var cts = new CancellationTokenSource();
ThreadPool.QueueUserWorkItem(Callback, cts.Token);
Console.WriteLine("按下回车键来取消操作");
Console.Read();
cts.Cancel();
Console.ReadKey();
}
private static void Callback(object state)
{
var token = (CancellationToken) state;
Console.WriteLine("开始计数");
Count(token, 1000);
}
private static void Count(CancellationToken token, int count)
{
for (var i = 0; i < count; i++)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("计数取消");
return;
}
Console.WriteLine($"计数为:{i}");
Thread.Sleep(300);
}
Console.WriteLine("计数完成");
}
```
线程同步
线程同步技术存在问题