1.2 使用C#创建线程
Thread t = new Thread(支持ParameterizedThreadStart和ThreadStart委托);
,ParameterizedThreadStart用t.Start(参数)
执行(本方法只能传一个参数,如果想传多个参数,可以传集合),后者用t.Start()
方法执行。static void Main(string[] args)
{
#region
Thread t = new Thread(Class1_1.PrintNumbers);
t.Start();
Class1_1.PrintNumbers();
Console.ReadLine();
#endregion
}
public class Class1_1
{
public static void PrintNumbers()
{
Console.WriteLine("staring...");
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}
}
}
1.3 暂定线程
Thread.Sleep(1000);
,线程暂停1s。static void Main(string[] args)
{
Thread t = new Thread(printNumbrWithDelay);
t.Start();
PrintNumbers();
Console.ReadLine();
}
public static void printNumbrWithDelay()
{
Console.WriteLine("staring...");
for (int i = 0; i < 10; i++)
{
Thread.Sleep(TimeSpan.FromSeconds(2));//等待2s,
Console.WriteLine(i);
}
}
public static void PrintNumbers()
{
Console.WriteLine("staring...");
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}
}
1.4 线程等待
Join
方法让程序等待另一个线程执行完成。然后在代码中使用该线程的计算结果,用Thread.Sleep行不通,因为并不知道执行计算要花的具体时间。static void Main(string[] args)
{
#region 1.4
Thread t = new Thread(Class1_4.PrintNumber);
t.Start();
t.Join();
Console.WriteLine("thread 结束");
Console.ReadLine();
#endregion
}
public class Class1_4
{
public static void PrintNumber()
{
Console.WriteLine("开始。。。");
for (int i = 0; i < 10; i++)
{
Thread.Sleep(500);
Console.WriteLine(i);
}
}
}
1.5 终止线程 t.Abort();
static void Main(string[] args)
{
#region 1.5
Thread t = new Thread(Class1_4.PrintNumber);
t.Start();
Thread.Sleep(3000);
t.Abort();
Console.WriteLine("线程{0}被终止了",Thread.CurrentThread.ManagedThreadId);
Class1_4.PrintNumber();
#endregion
}
t.Abort()
是给线程t注入ThreadAbortException方法,导致线程终结。该异常很危险,因为可以在任何时候发生并且彻底摧毁应用程序,但是也不一定总能终结线程,目标线程可以通过处理该异常并调用Thread.ResetAbort
方法来拒绝被终止。不推荐用abort关闭线程,可优先用其他方法,如CancellationToken方法取消线程的执行。1.6 检测线程状态
Thread.CurrentThread.ThreadState
获得线程状态枚举值,具体枚举值可以F12进去看看。Thread.CurrentThread
静态属性获得当前线程对象。Thread t = new Thread(Class1_6.PrintNumber);
Console.WriteLine(t.ThreadState.ToString());
public static void PrintNumber()
{
Console.WriteLine("开始。。。");
Console.WriteLine(Thread.CurrentThread.ThreadState.ToString());
for (int i = 0; i < 10; i++)
{
Thread.Sleep(2000);
Console.WriteLine(i);
}
}
1.7 线程优先级
t.Priority = ThreadPriority.Highest;//设置线程优先级
(最高优先级),Lowest(最低优先级)。在多核CPU中实际可能二者运行感觉没啥区别或很接近(单核时区别才会明显),但是如果有其他程序占用所有CPU核心,结果则会截然不同。设置Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(1);
选项来模拟该情形,让操作系统将所有线程运行在单个CPU核心(第一个核心)上,得到结果是优先级高的得到运算时间多于优先级低的线程。1.8 前台线程和后台线程
var t2 = new Thread(本处省略无参方法名);
t2.IsBackground = true;//设置为后台线程,不设置则该线程默认为前台线程
1.2 ~ 1.8 线程:创建、暂定、等待、终止、状态、优先级、前台线程和后台线程
原文:https://www.cnblogs.com/anjun-xy/p/11750226.html