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,………..
多线程慎用。。。
C#多线程 线程嵌套调用问题的更多相关文章
- 多线程-Thread、Runnable 创建线程和调用过程分析
创建线程的两种方式: 1:创建Thread类的子类 ---基于继承的技术 . 2:以Runnable接口实例为构造参数直接通过new 创建 Thread 实例.---基于组合的技术. public ...
- [C#学习]在多线程中如何调用Winform[转]
问题的产生: 我的WinForm程序中有一个用于更新主窗口的工作线程(worker thread),但文档中却提示我不能在多线程中调用这个form(为什么?),而事实上我在调用时程序常常会崩掉.请问如 ...
- 零基础学习java------day18------properties集合,多线程(线程和进程,多线程的实现,线程中的方法,线程的声明周期,线程安全问题,wait/notify.notifyAll,死锁,线程池),
1.Properties集合 1.1 概述: Properties类表示了一个持久的属性集.Properties可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串 一个属性列表可包含另 ...
- C++ 11 多线程--线程管理
说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...
- java多线程-线程池
线程池(Thread Pool)对于限制应用程序中同一时刻运行的线程数很有用.因为每启动一个新线程都会有相应的性能开销,每个线程都需要给栈分配一些内存等等. 我们可以把并发执行的任务传递给一个线程池, ...
- 如何:对 Windows 窗体控件进行线程安全调用
http://msdn.microsoft.com/zh-cn/library/ms171728(VS.90).aspx http://msdn.microsoft.com/zh-cn/library ...
- java多线程-线程通信
线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 通过共享对象通信 忙等待 wait(),notify()和 notifyAll() 丢失的信号 假唤醒 多线 ...
- 在线程中调用SaveFileDialog
在多线程编程中,有时候可能需要在单独线程中执行某些操作.例如,调用SaveFileDialog类保存文件.首先,我们在Main方法中创建了一个新线程,并将其指向要执行的委托SaveFileAsyn.在 ...
- java 多线程—— 线程让步
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
随机推荐
- 类和对象(12)—— this指针
首先,我们都知道类的成员函数可以访问类的数据(限定符只是限定于类外的一些操作,类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针: ...
- mysql之 mysql 5.6不停机主从搭建(一主一从基于日志点复制)
环境说明:版本 version 5.6.25-log 主库ip: 10.219.24.25从库ip:10.219.24.22os 版本: centos 6.7已安装热备软件:xtrabackup 防火 ...
- mysql之 [ERROR] InnoDB: Unable to lock ./ibdata1, error: 11
问题描述:启动MySQL后,出现连接不上,报 [ERROR] InnoDB: Unable to lock ./ibdata1, error: 11[root@mysql01 ~]# service ...
- MyEclipse安装jbpm插件
介绍如何在MyEclipse8.6里安装jbpm插件. 工具/原料 MyEclipse8.6 jbpm-4.4.rar 方法/步骤 1 下载jbpm包并解压 下载最新的jbpm包,本文以jbpm4.4 ...
- WPF开发中Designer和码农之间的合作
想要用WPF做出一流的软件界面, 必须要Designer和码农通力合作.理想的情况是平时并行开发,Designer用Expression套件(包括Design和Blend)来设计界面,码农开发Mode ...
- sleep 和 usleep的实现方法
一.sleep 和 usleep 1.不属于系统调用,是glibc 库函数实现的: 2.glibc函数库中通过调用内核的nanosleep实现的: 3.内核nanosleep通过调用 hrtimer_ ...
- Day3-Python基础3--默认参数和参数组
一.默认参数 先看下下面的代码: def stu_register(name,age,country,course): print("----注册学生信息------") prin ...
- Annotation之四:注解中的-Xlint:unchecked和 -Xlint:deprecation
一.-Xlint:unchecked用法 对如下Test.java编译时 package com.dxz.annotation; import java.util.ArrayList; import ...
- POJ 1276 Cash Machine(单调队列优化多重背包)
Cash Machine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 38986 Accepted: 14186 De ...
- 为什么每个浏览器都有Mozilla字样
你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样?Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ( ...