线程的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


相关推荐

  • ManagementObject_getsuperclass方法

    ManagementObject_getsuperclass方法原文:http://blog.csdn.net/hardstone1/article/details/5380775网上代码和MSDN帮助中都没有列出 ManagementObject[""]这里到底有哪些属性可以使用,参考了http://www.groupsrv.com/dotnet/about69957.html了之后发现了可以枚举出来所有属性,代码如函数getallprop()。…

    2022年10月2日
    5
  • Java基础学习总结(20)——基础语法

    Java基础学习总结(20)——基础语法Java基础学习总结(20)——基础语法

    2022年4月22日
    45
  • 爬虫框架Scrapy安装

    爬虫框架Scrapy安装免责声明:本文所记录的技术手段及实现过程,仅作为爬虫技术学习使用,不对任何人完全或部分地依据本文的全部或部分内容从事的任何事情和因其任何作为或不作为造成的后果承担任何责任。Scrapy爬虫框架用Python编写的功能强大,应用范围最广,最流行的爬虫框架,框架提供了大量的爬虫相关的组件,能够方便快捷的完成各网站的爬取。01Scrapy安装打开scrapy官方网站【scrapy.org】,目前最新版本为2.5:按照官方提供的脚本,在命令行执行安装:pipinst..

    2026年1月18日
    4
  • Java实现并查集

    Java实现并查集喝杯 82 年的 Java 压压惊这次需要介绍的就是并查集并查集的简单应用就是连通图 网络通信连接等等总之很重要那么先说一下这次的算法是 1 union find 简单并查集 2 quick union 优化的并查集 3 加权值 quick union 处理了 2 的最坏情况 4 路径压缩加权值 quick union 如果只是想要一下算法 你可以直接跳到最后看第 4 个算法接下来 我

    2025年6月1日
    8
  • Manus 邀请码获取方法 + 使用指南|2025年最强AI智能体实战教程

    Manus 邀请码获取方法 + 使用指南|2025年最强AI智能体实战教程

    2026年3月15日
    6
  • keras 双向LSTM 简单示例[通俗易懂]

    keras 双向LSTM 简单示例[通俗易懂]importtensorflow.compat.v1astffromkeras.layersimportConvLSTM2D,TimeDistributed,Conv2D,Bidirectionalimportnumpyasnpinputs_np=tf.convert_to_tensor(np.random.random((4,6,256,256,3)).astype(np.float32))#shape=[5,6,10,10,3]conv1=TimeDi.

    2022年6月21日
    40

发表回复

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

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