zoukankan      html  css  js  c++  java
  • C#多线程 线程嵌套调用问题

    线程嵌套指的是:线程A的执行代码启动了线程B,线程B的执行代码又启动了线程C。

    我原本以为线程A被Abort后,线程B会自动被Abort,但是我大错特错了。

    在这种场景下,线程的管理就非常重要了。

    线程A被Abort后线程B是不会被他的父线程Abort的,除非你强制在线程A中Abort线程B。

    在线程A接收到Abort命令后(catch(ThreadAbortException)),Abort线程B即可。

    当然,如果你的需求不是在线程A被Abort后,不Abort线程B,那么也可以不Abort线程B,但是这样就放养了线程B,不受管制。

    下面是一个例子:

    t1启动线程t2,t2启动了t3.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    
    namespace InnerThread
    {
        class Program
        {
            static void Main(string[] args)
            {
                Thread t1 = new Thread(new ThreadStart(DoWork1));
                t1.Name = "T1";
                t1.Start();
                Thread.Sleep(5000);
                t1.Abort();
                Console.ReadKey();
            }
    
            static void DoWork1()
            {
                Thread t2 = null;
                try
                {
                     t2 = new Thread(new ThreadStart(DoWork2));
                    t2.Name = "T2";
                    t2.Start();
                    while (true)
                    {
                        Console.WriteLine("t1 is working");
                        Thread.Sleep(500);
                    }
                }
                catch (ThreadAbortException)
                {
                    Console.WriteLine("t1 has been abort.");
                    t2.Abort();
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
            static void DoWork2()
            {
                Thread t3 = null;
                try
                {
                     t3 = new Thread(new ThreadStart(DoWork3));
                    t3.Name = "T3";
                    t3.Start();
                    while (true)
                    {
                        Console.WriteLine("t2 is working");
                        Thread.Sleep(500);
                    }
                }
                catch (ThreadAbortException)
                {
                    Console.WriteLine("t2 has been abort.");
                    t3.Abort();
                }
            }
            static void DoWork3()
            {
                try
                { 
                    while (true)
                    {
                        Console.WriteLine("t3 is working"); 
                    Thread.Sleep(500);
                    }
                }
                catch (ThreadAbortException)
                {
                    Console.WriteLine("t3 has been abort.");
                }
            }
        }
    }

    执行结果如下:

    当t1被Abort后,调用t2的Abort,t2被Abort,………..

    多线程慎用。。。

  • 相关阅读:
    转高少公众号【影响个人超速成长的三个因素】
    并发-ThreadLocal源码分析
    并发-CountDownLatch、CyclicBarrier和Semaphore
    并发-阻塞队列源码分析
    并发-线程池源码分析
    并发-ConcurrentHashMap源码分析
    并发-HashMap和HashTable源码分析
    《java并发编程实战》读书笔记
    《大型网站系统与JAVA中间件实践》读书笔记-数据访问层
    tomcat常用配置详解和优化方法
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9877236.html
Copyright © 2011-2022 走看看