关于Thread.IsBackground属性的理解

关于Thread.IsBackground属性的理解C#中,Thread类有一个IsBackground的属性.MSDN上对它的解释是:获取或设置一个值,该值指示某个线程是否为后台线程。个人感觉这样的解释等于没有解释..Net中的线程,可以分为后台线程和前台线程。后台线程与前台线程并没有本质的区别,它们之间唯一的区别就是:后台线程不会防止应用程序的进程被终止掉。呵呵,这句话读出来好像并不那么好懂.其实,说白了就是当前台线程都结束了的时候,…

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

Jetbrains全系列IDE稳定放心使用

C#中,Thread类有一个IsBackground 的属性.MSDN上对它的解释是:获取或设置一个值,该值指示某个线程是否为后台线程。个人感觉这样的解释等于没有解释.

.Net中的线程,可以分为后台线程和前台线程。后台线程与前台线程并没有本质的区别,它们之间唯一的区别就是:后台线程不会防止应用程序的进程被终止掉。呵呵,这句话读出来好像并不那么好懂.

其实,说白了就是当前台线程都结束了的时候,整个程序也就结束了,即使还有后台线程正在运行,此时,所有剩余的后台线程都会被停止且不会完成.但是,只要还有一个前台线程没有结束,那么它将阻止程序结束.这就是为什么有些设计不够完美的WinForm程序,在某种特定的情况下,即使所有的窗口都关闭了,但是在任务管理器的管理列表里仍然可以找到该程序的进程,仍然在消耗着CPU和内存资源.因此,在WinForm程序中,关闭所有窗口前,应该停止所有前台线程,千万不要遗忘了某个前台线程.应用程序进程的存亡由前台线程决定而于后台线程无关.这就是它们的区别.

知道了前后台线程的区别,就应该知道如何声明IsBackgroud属性的值了.

值得说明的一点是:改变线程从前台到后台不会以任何方式改变它在CPU协调程序中的优先级和状态。因为前台后线程与程序进程的优先级无关.

结束前摘录MSDN上一段示例码,以帮助大家便好的理解这一区别:

下面的代码示例对比了前台线程与后台线程的行为。创建一个前台线程和一个后台线程。前台线程使进程保持运行,直到它完成它的 while 循环。前台线程完成后,进程在后台线程完成它的 while 循环之前终止。

using System;
using System.Threading;

class Test
{
    static void Main()
    {
        BackgroundTest shortTest = new BackgroundTest(10);
        Thread foregroundThread = 
            new Thread(new ThreadStart(shortTest.RunLoop));
        foregroundThread.Name = "ForegroundThread";

        BackgroundTest longTest = new BackgroundTest(50);
        Thread backgroundThread = 
            new Thread(new ThreadStart(longTest.RunLoop));
        backgroundThread.Name = "BackgroundThread";
        backgroundThread.IsBackground = true;

        foregroundThread.Start();
        backgroundThread.Start();
    }
}

class BackgroundTest
{
    int maxIterations;

    public BackgroundTest(int maxIterations)
    {
        this.maxIterations = maxIterations;
    }

    public void RunLoop()
    {
        String threadName = Thread.CurrentThread.Name;
        
        for(int i = 0; i < maxIterations; i++)
        {
            Console.WriteLine("{0} count: {1}", 
                threadName, i.ToString());
            Thread.Sleep(250);
        }
        Console.WriteLine("{0} finished counting.", threadName);
    }
}

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 11.1JS笔记_数据结构手写笔记

    11.1JS笔记_数据结构手写笔记11.1JS笔记

    2022年4月20日
    63
  • 风控决策引擎经验

    风控决策引擎经验转载自https://mp.weixin.qq.com/s/LDcquVOTlCKJluyWG3AGAA一套完整的风控体系,在风控中,少不了决策引擎,今天就浅谈一下风控决策引擎。一、优先级风控决策引擎是一堆风控规则的集合,通过不同的分支、层层规则的递进关系进行运算。而既然是组合的概念,则在这些规则中,以什么样的顺序与优先级执行便额外重要。风控系统的作用在于识别绝对风控与标识相对风险…

    2022年6月15日
    50
  • 网页升级中每天自动更新什么意思_快照搜索

    网页升级中每天自动更新什么意思_快照搜索网站被收录是百度蜘蛛爬行、记录、筛选的结果。网站被爬行后会在搜索引擎数据库中留下数据,当判断收录的内容达到用户要求质量时,网站的快照才会被释放出来,而快照的时候很多时候都是最初的爬行时间。这也是我们很多站长发现被收录后,快照时间不是当天时间的原因了。  在我们的认知中,每次百度快照的更新都是搜素引擎对网站数据的一次爬行收录过程,也就意味着更新就会带来网站排名的微调动。所以,更多时候

    2022年9月1日
    4
  • 一文搞懂Spark的Task调度器(TaskScheduler)[通俗易懂]

    一文搞懂Spark的Task调度器(TaskScheduler)[通俗易懂]TaskScheduler的核心任务是提交TaskSet到集群运算并汇报结果。为TaskSet创建和维护一个TaskSetManager,并追踪任务的本地性及错误信息。遇到Straggle任务会放到其他结点进行重试。向DAGScheduler汇报执行情况,包括在Shuffle输出丢失时报告fetchfailed错误等信息。TaskScheduler底层调度器1.TaskScheduler原理剖析2.TaskScheduler源代码解析2.1TaskScheduler实例化源代码.

    2022年10月10日
    4
  • 网站服务器建立数据库连接时出错,WordPress提示建立数据库连接出错的解决办法…[通俗易懂]

    网站服务器建立数据库连接时出错,WordPress提示建立数据库连接出错的解决办法…[通俗易懂]很多新手使用wordpress程序建站初期,会遇到页面提示:建立数据库连接出错,英文提示:“Errorestablishingadatabaseconnection”。那么遇到这种情况大家会很头疼,我到底哪里操作不对呀?本文中老魏就实际遇到的此类情况做详细解释。出错的原因有几种,从字面意思能看出来和数据库无法正常读取有关。也许是因为数据库登陆信息不对,也许是数据库挂了无法读取等等。Wor…

    2022年9月24日
    5
  • IntelliJ IDEA创建maven web项目(IDEA新手适用)

    IntelliJ IDEA创建maven web项目(IDEA新手适用)PS:从eclipse刚转到IDEA,对于这个陌生的工具我表示无言,但听说很好用,也就试试,结果我几乎花了一晚上的时间才搭起来mavenweb项目,觉得在此给各位一个搭建mavenweb项目的教程,指出我踩过的各种坑!步骤一:首先先创建一个project,在这里就是创建一个maven的工作空间步骤二:按照下面的步骤操作就可以了,最后next首先,选择左边的maven然后在右…

    2022年6月26日
    55

发表回复

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

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