最近自己写了个小爬虫,里面用到了多线程技术,忽然发现对此技术竟然有些陌生了,于是乎开始疯狂的去问度娘,在此记录下来,以便自己和各位小伙伴们学习。
一、什么是线程
一个应用程序就相当于一个进程,进程拥有应用程序的所有资源进程包括线程,进程的资源被线程共享,但不拥有线程。我们可以打开电脑中的任务管理器,运行的.exe都是一个进程,里面的分支是线程。
二、多线程
多线程其实就是进程中一段并行运行的代码
1. 创建并启动线程
static void Main() { //获取线程Id var threadId = Thread.CurrentThread.ManagedThreadId; var thread = new Thread(Test1); thread.Start(); Console.WriteLine(threadId + "_Main()"); Console.Read(); } /// <summary> /// 测试方法 /// </summary> private static void Test1() { //获取线程Id var threadId = Thread.CurrentThread.ManagedThreadId; Console.WriteLine(threadId + "_Test()"); for (int i = 0; i < 10; i++) { Console.WriteLine(threadId + "_" + i); } }
结果:
2、暂定线程诺干时间
static void Main() { //获取线程Id var threadId = Thread.CurrentThread.ManagedThreadId; var thread = new Thread(Test1); thread.Start(); Console.WriteLine($"主线程Id{threadId}_Main()"); Console.Read(); } /// <summary> /// 测试方法 /// </summary> private static void Test1() { //获取线程Id var threadId = Thread.CurrentThread.ManagedThreadId; Console.WriteLine($"辅线程Id{threadId}_Test()"); for (int i = 0; i < 10; i++) { Thread.Sleep(1000);//单位毫秒 Console.WriteLine($"辅线程Id{threadId}_{DateTime.Now}"); } }
结果:
3、线程合并
Thread.Join操作会阻塞当前线程,等待子线程完成后再进行运行。
static void Main() { //获取线程Id var threadId = Thread.CurrentThread.ManagedThreadId; var thread = new Thread(Test1); thread.Start(); Console.WriteLine($"主线程Id{threadId}_Main()1"); thread.Join(); Console.WriteLine($"主线程Id{threadId}_Main()2"); Console.Read(); } /// <summary> /// 测试方法 /// </summary> private static void Test1() { //获取线程Id var threadId = Thread.CurrentThread.ManagedThreadId; Console.WriteLine($"辅线程Id{threadId}_Test()"); for (int i = 0; i < 10; i++) { Thread.Sleep(1000);//单位毫秒 Console.WriteLine($"辅线程Id{threadId}_{DateTime.Now}"); } }
结果:
4、线程终止
static void Main() { //获取线程Id var threadId = Thread.CurrentThread.ManagedThreadId; var thread = new Thread(Test1); thread.Start(); Console.WriteLine($"主线程Id{threadId}_Main()1"); Thread.Sleep(3000); thread.Abort(); Console.WriteLine($"主线程Id{threadId}_Main()2"); Console.Read(); } /// <div>本文来源gaodai.ma#com搞##代!^码7网</div><summary> /// 测试方法 /// </summary> private static void Test1() { //获取线程Id var threadId = Thread.CurrentThread.ManagedThreadId; Console.WriteLine($"辅线程Id{threadId}_Test()"); for (int i = 0; i < 10; i++) { Thread.Sleep(1000);//单位毫秒 Console.WriteLine($"辅线程Id{threadId}_{DateTime.Now}"); } }