- 创建线程的类有三种:Thread类、ThreadPool类、Task类。
- 使用Thread类需要实例化Thread对象,调用无参方法需要传入ThreadStart委托对象,调用有参方法需要传入ParameterizedThreadStart委托对象,实例化Thread对象后调用Start()即可。
- 使用ThreadPool类直接调用ThreadPool.QueueUserWorkItem()即可,传入有参方法及其参数。
- 使用Task类直接调用Task.Run()即可,传入无参方法或有参方法及其参数。
- 有参方法的参数类型只能是object,且只能有一个,如果需要传入多个参数,建议自定义一个类型,用于传递参数。
- 避免在代码中调用Thread.Sleep(),除非是模拟高延迟操作,Abort()和Join()就更不建议使用。
using System;
using System.Threading;
using System.Threading.Tasks;
namespace _24
{
class Program
{
static void Main(string[] args)
{
TestThread();
TestThreadPool();
TestTask();
}
public static void TestThread()
{
new Thread(new ThreadStart(Test.Print1)).Start();
new Thread(new ParameterizedThreadStart(Test.Print3)).Start(3);
}
public static void TestThreadPool()
{
ThreadPool.QueueUserWorkItem(Test.Print3, "&");
}
public static void TestTask()
{
Task task1 = Task.Run(() => Test.Print2());
Task task2 = Task.Run(() => Test.Print3(new Index(4, 5)));
}
}
class Test
{
public static void Print1()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine(1);
Thread.Sleep(100);
}
}
public static void Print2()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine(2);
Thread.Sleep(100);
}
}
public static void Print3(object o)
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine(o);
Thread.Sleep(100);
}
}
}
class Index
{
private readonly int i;
private readonly int j;
public Index(int i, int j)
{
this.i = i;
this.j = j;
}
public override string ToString()
{
return $"i = {i},j = {j}";
}
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b2134752760e854118156de5973729c5.png#pic_center)