线程的IsBackground属性「建议收藏」

线程的IsBackground属性「建议收藏」.Net的公用语言运行时(CommonLanguageRuntime,CLR)能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。.net环境使用Thread建立的线程默认情况下是前台线程,即线程属性IsBackground=

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

.Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束

.net环境使用Thread建立的线程默认情况下是前台线程,即线程属性IsBackground=false,在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。一般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息。而前台线程一般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫描的程序。下面的代码演示了前台和后台线程的区别。

public static void myStaticThreadMethod()
{

    Thread.Sleep(3000);
}
Thread thread = new Thread(myStaticThreadMethod);
// thread.IsBackground = true;
thread.Start()
如果运行上面的代码,程序会等待3秒后退出,如果将注释去掉,将thread设成后台线程,则程序会立即退出
要注意的是,必须在调用Start方法之前设置线程的类型,否则一但线程运行,将无法改变其类型
通过BeginXXX方法运行的线程都是后台线程

启动了多个线程的程序在关闭的时候却出现了问题,如果程序退出的时候不关闭线程,那么线程就会一直的存在,但是大多启动的线程都是局部变量,不能一一的关闭,如果调用Thread.CurrentThread.Abort()方法关闭主线程的话,就会出现ThreadAbortException 异常,因此这样不行。
后来找到了这个办法: Thread.IsBackground设置线程为后台线程。

msdn对前台线程和后台线程的解释:托管线程或者是后台线程,或者是前台线程。后台线程不会使托管执行环境处于活动状态,除此之外,后台线程与前台线程是一样的。一旦所有前台线程在托管进程(其中 .exe文件是托管程序集)中被停止,系统将停止所有后台线程并关闭。通过设置 Thread.IsBackground 属性,可以将一个线程指定为后台线程或前台线程。例如,通过将 Thread.IsBackground 设置为 true,就可以将线程指定为后台线程。同样,通过将 IsBackground 设置为 false,就可以将线程指定为前台线程。从非托管代码进入托管执行环境的所有线程都被标记为后台线程。通过创建并启动新的 Thread 对象而生成的所有线程都是前台线程。如果要创建希望用来侦听某些活动(如套接字连接)的前台线程,则应将 Thread.IsBackground 设置为 true,以便进程可以终止。
所以解决办法就是在主线程初始化的时候,设置:Thread.CurrentThread.IsBackground = true;

这样,主线程就是后台线程,在关闭主程序的时候就会关闭主线程,从而关闭所有线程。但是这样的话,就会强制关闭所有正在执行的线程,所以在关闭的时候要对线程工作的结果保存。

基于前后台线程的区别,在实际编码中应该更多地使用后台线程。只有在非常关键的工作中,如线程正在执行事务或占有的某些非托管资源需要释放时,才使用前台线程。


http://book.51cto.com/art/201109/292349.htm

http://www.51testing.com/html/55/102055-211889.html

http://blog.163.com/liulei0729@126/blog/static/32530612201071743942648/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181083.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月17日 上午10:00
下一篇 2022年10月17日 上午10:16


相关推荐

  • Java实现简易的词法分析器

    Java实现简易的词法分析器此次也是课题需要 才写了这么一个项目 编译原理课你懂的 由于个人比较喜欢 Java 因此写了一个 Java 版本简易的词法分析器 也是因为 Java 对数组的使用比较随意 注意 没有出错处理 如 9int 或是 int23 等等一系列错误是检测不出来的 但是可以检测小数和注释的错误 错误种类太多太麻烦 就没有处理了 实验要求如下 实验一 nbsp 词法分析程序设计 实验要求 对一个简单的语言的子集编制一个一遍扫描

    2026年3月17日
    2
  • noip2014普及组复赛题解_关于如何提高产能的报告

    noip2014普及组复赛题解_关于如何提高产能的报告NOIP2012提高组复赛解题报告

    2022年8月22日
    7
  • MERGE 函数的使用[通俗易懂]

    MERGE 函数的使用[通俗易懂]1.Merge是什么?

    2022年4月30日
    213
  • matlab axis坐标轴相关设置详解

    matlab axis坐标轴相关设置详解

    2022年6月9日
    36
  • 可变形卷积pytorch版本解读

    可变形卷积pytorch版本解读1 前言 argparse 是 python 用于解析命令行参数和选项的标准模块例如 pythonparseT pyinput txtoutput txtuser nameport 8080 使用步骤 1 importargpar parser argparse ArgumentPars 3 parser add argument 4 pa

    2025年12月9日
    10
  • 对单片机毕业设计的理解「建议收藏」

    对单片机毕业设计的理解「建议收藏」对单片机毕业设计的理解我的大学生活即将快要结束了,在这期间,我帮好几个人都做了关于单片机的毕业设计,其中也有接挺多这种单子赚了点辛苦费的,其中有关于51单片机的,也有STM32单片机的,甚至STM32可以细分为F1系列和F4系列。本来我是没有想接单的,一开始是一个高中同学,因为是同一个专业但是不同学校,他的毕业设计就是关于单片机的,他那时就求助我,然后我直接帮他完成了,我帮他做完全是因为关系好,结果帮他做完后他就给我介绍了他的一个大学同学也想完成他的毕业设计,所以我就做了,最后做完也是给了点辛苦费。没想到

    2026年4月17日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号