C#多线程总结
1、 首先多线程启动必须包含using System.Threading;这个头文件。必须使用Thread这个类。
Thread 这个类有如下常用的属性:
对于Thread类更多:
https://msdn.microsoft.com/zh-cn/library/system.threading.thread%28v=vs.110%29.aspx
IsAlive |
指示线程的当前状态(true|false) |
IsBackground |
指示线程是否为后台线程 |
Name |
获取或设置线程的名字(线程默认为前台线程) |
Priority |
获取设置线程的优先级(其中属性值为枚举类型enum ThreadPriority { Lowest, BelowNormal, Normal, AboveNormal, Highest }) |
任何线程创建范围内try/catch/finally块,当线程开始执行便不再与其有任何关系。
2、线程用Thread类来创建, 通过ThreadStart委托来指明方法从哪里开始运行,下面是ThreadStart委托如何定义的:
public delegate voidThreadStart();
3、启动线程的方法:有三种。
第一种:使用委托来调用要执行的函数。
//ThreadStart委托不支持传入参数
public static void Test1()
{
Thread t = new Thread(new ThreadStart(Go));
t.Start();
Go();
}
public static void Go()
{
Console.WriteLine(i++);
}
第二种:直接把要调用的函数放在线程中,然后启动。
public static void Test2()
{
Thread t = new Thread(Go);
t.Start();
}
第三种:如果线程的函数比较简单可以直接写在匿名委托里。
public static void Test3()
{
Thread t = new Thread(delegate() { Console.WriteLine(i++); });
t.Start();
}
4、.NET framework定义了另一个版本的委托叫做ParameterizedThreadStart,它可以接收一个单独的object类型参数,而且这个方法的参数必须是object类型的。ParameterizedThreadStart的特性是在使用之前我们必需对我们想要的类型(这里是bool)进行装箱操作,并且它只能接收一个参数。 一个替代方案是使用一个匿名方法调用一个普通的方法
publicdelegate void ParameterizedThreadStart (object obj);
publicstatic void Test4()
{
Thread t = new Thread(newParameterizedThreadStart(Go1));
t.Start(true);
t.Priority=ThreadPriority.
Go1(false);
}
publicstatic void Go1(object b)
{
bool b1=(bool)b;
Console.WriteLine(b1?"HELLO":"hello");
}
、C# Thread类:判断多个线程是否都结束的两种方法
5、确定所有线程是否都完成了工作的方法有很多,如可以采用类似于对象计数器的方法,所谓对象计数器,就是一个对象被引用一次,这个计数器就加1,销毁引用就减1,如果引用数为0,则垃圾搜集器就会对这些引用数为0的对象进行回收。
方法一:线程计数器
线程也可以采用计数器的方法,即为所有需要监视的线程设一个线程计数器,每开始一个线程,在线程的执行方法中为这个计数器加1,如果某个线程结束(在线程执行方法的最后为这个计数器减1),为这个计数器减1。然后再开始一个线程,按着一定的时间间隔来监视这个计数器,如是棕个计数器为0,说明所有的线程都结束了。当然,也可以不用这个监视线程,而在每一个工作线程的最后(在为计数器减1的代码的后面)来监视这个计数器,也就是说,每一个工作线程在退出之前,还要负责检测这个计数器。使用这种方法不要忘了同步这个计数器变量啊,否则会产生意想不到的后果。
方法二:使用Thread.join方法
join方法只有在线程结束时才继续执行下面的语句。可以对每一个线程调用它的join方法,但要注意,这个调用要在另一个线程里,而不要在主线程,否则程序会被阻塞的。实例:
private static void threadMethod(Objectobj)
{
Thread.Sleep(Int32.Parse(obj.ToString()));
Console.WriteLine(obj + "毫秒任务结束");
}
private static void joinAllThread(objectobj)
{
Thread[] threads = obj asThread[];
foreach (Thread t in threads)
t.Join();
Console.WriteLine("所有的线程结束");
}
static void Main(string[] args)
{
Thread thread1 = newThread(threadMethod);
Thread thread2 = newThread(threadMethod);
Thread thread3 = new Thread(threadMethod);
thread1.Start(3000);
thread2.Start(5000);
thread3.Start(7000);
Thread joinThread = newThread(joinAllThread);
joinThread.Start(new Thread[] {thread1, thread2, thread3 });
}