精华内容
下载资源
问答
  • 创建前台线程
    2020-12-23 13:51:58

    前台线程和后台线程
    默认情况下,您显式创建的线程是前台线程。只要前台线程中的任何一个正在运行,它就可以使应用程序保持活动状态,而后台线程则不会。一旦所有前台线程完成,应用程序结束,所有仍在运行的后台线程终止。

    线程的前台/后台状态与其优先级或执行时间的分配无关。

    您可以使用其IsBackground属性查询或更改线程的背景状态。这是一个例子:

    复制代码
    class PriorityTest
    {
    static void Main (string[] args)
    {
    Thread worker = new Thread ( () => Console.ReadLine() );
    if (args.Length > 0) worker.IsBackground = true;
    worker.Start();
    }
    }
    复制代码
    如果不带任何参数调用此程序,则工作线程将处于前台状态,并将在ReadLine语句上等待用户按Enter。同时,主线程退出,但是应用程序继续运行,因为前台线程仍然处于活动状态。

    另一方面,如果将参数传递给Main(),则会为工作程序分配背景状态,并且在主线程结束(终止ReadLine)时,程序几乎立即退出。

    当进程以这种方式终止时,将规避后台线程执行堆栈中的所有finally块。如果您的程序最终使用(或使用)块来执行清理工作(例如释放资源或删除临时文件),则会出现问题。为了避免这种情况,您可以在退出应用程序后显式等待此类后台线程。

    有两种方法可以实现此目的:

    如果您自己创建了线程,请在该线程上调用Join。
    如果您使用的是共享线程,请使用事件等待句柄。
    在这两种情况下,您都应指定一个超时时间,以便在由于某种原因而拒绝完成的叛逆线程时可以放弃它。这是您的备份退出策略:最后,您希望您的应用程序关闭-无需用户从任务管理器中寻求帮助!

    如果用户使用任务管理器强制结束.NET进程,则所有线程都“掉线”,就好像它们是后台线程一样。这是观察到的,而不是记录的行为,并且它可能因CLR和操作系统版本而异。

    前景线程不需要这种处理,但是您必须注意避免可能导致线程无法结束的错误。应用程序无法正常退出的常见原因是活动的前台线程的存在。

    线程优先级
    线程的“优先级”属性确定相对于操作系统中其他活动线程而言,执行时间的长短如下:

    枚举ThreadPriority {最低,低于正常,正常,高于正常,最高}

    仅在同时激活多个线程时,这才有意义。

    在提高线程的优先级之前,请仔细考虑-这可能导致诸如其他线程的资源匮乏之类的问题。

    提升线程的优先级并使其无法执行实时工作,因为它仍然受到应用程序进程优先级的限制。要执行实时工作,您还必须使用System.Diagnostics中的Process类提高流程优先级(我们没有告诉您如何执行此操作):

    1
    2
    using (Process p = Process.GetCurrentProcess())
    p.PriorityClass = ProcessPriorityClass.High;

    实际上,ProcessPriorityClass.High比最高优先级低了一个等级:实时。将进程优先级设置为“实时”会指示OS,您从不希望该进程将CPU时间浪费给另一个进程。如果您的程序进入意外的无限循环,您甚至可能会发现操作系统已锁定,只剩下电源按钮可以拯救您!因此,“高”通常是实时应用程序的最佳选择。

    如果您的实时应用程序具有用户界面,则提高vb.net教程
    进程优先级将给屏幕更新带来过多的CPU时间,从而减慢整个计算机的速度(尤其是在UI复杂的情况下)。降低主线程的优先级并提高进程的优先级可确保实时线程不会因屏幕重绘而被抢占,但不会解决使其他应用程序耗尽CPU时间的问题,因为操作系统仍会分配整个过程的资源不成比例。理想的解决方案是使实时工作程序和用户界面作为具有不同进程优先级的单独应用程序运行,并通过远程处理或内存映射文件进行通信。内存映射文件非常适合此任务。简而言之,我们将在C#4.0的第14和25章中解释它们的工作原理。

    即使提高了流程优先级,托管环境在处理严格的实时需求方面的适用性也受到限制。除了由自动垃圾收集c#教程引起的延迟问题外,操作系统(甚至对于非托管应用程序)可能还会带来其他挑战,而这些挑战最好通过专用硬件或专用实时平台来解决。

    更多相关内容
  • 4、托管线程池中的线程都是后台线程,使用new Thread方式创建的线程默认都是前台线程。   下面做个小例子来证实一下,代码如下很简单: class Program { static AutoResetEvent autoEvent =new Auto
  • 前台线程和后台线程

    2021-11-23 10:08:41
    当主程序启动时定义了两个不同的线程,默认情况下显示创建的线程是前台线程,通过手动设置线程的对象IsBackground的属性为True来创建一个后天线程,通过配置来实现第一个线程会比第二个线程先完成,然后终止程序。...

    当主程序启动时定义了两个不同的线程,默认情况下显示创建的线程是前台线程,通过手动设置线程的对象IsBackground的属性为True来创建一个后天线程,通过配置来实现第一个线程会比第二个线程先完成,然后终止程序。前台线程与后台线程的主要区别就是:进程会等待所有的前台线程完成后再结束工作,但是如果只剩下后台线程,则会直接结束工作。如果程序定义了一个不会完成的前台线程,主程序不会正常结束。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace 线程
    {
        class Program
        {
            static void Main(string[] args)
            {
                var SampleForeground = new ThreadSample(10);
                var sampleForeground = new ThreadSample(20);
    
                var threadOne = new Thread(sampleForeground.CountNumbers);
                threadOne.Name = "ForegroundThread";
                var threadTwo = new Thread(sampleForeground.CountNumbers);
                threadTwo.Name = "BackgroundThread";
                threadTwo.IsBackground = true;
    
                threadOne.Start();
                threadTwo.Start();
            }
        }
        class ThreadSample
        {
            private readonly int _iterations;
            public ThreadSample(int iterations)
            {
                _iterations = iterations;
            }
            public void CountNumbers()
            {
                for (int i = 0; i < _iterations; i++)
                {
                    Thread.Sleep(TimeSpan.FromSeconds(0.5));
                    Console.WriteLine("{0} prints {1}",Thread.CurrentThread.Name,i);
                }
            }
        }
    }
    
    
    展开全文
  • Java前台线程与后台线程上一篇博客在main()方法中,创建并启动了四个新的线程后,main()方法中的代码执行完毕,此时,方法会结束,main线程也就随之结束了通过程序的运行结果可以看出,虽然,main线程结束了,但是...

    Java前台线程与后台线程

    上一篇博客在main()方法中,创建并启动了四个新的线程后,main()方法中的代码执行完毕,此时,方法会结束,main线程也就随之结束了

    通过程序的运行结果可以看出,虽然,main线程结束了,但是整个Java程序却没有随之结束,仍然在执行售票的代码

    对于Java程序来说,只要还有一个前台线程在运行,这个进程就不会结束,如果一个进程中,只有后台线程在运行,这个进程就会结束

    前台线程与后台线程

    前台线程、后台线程是一种相对的概念

    新创建的线程,默认都是前台线程

    如果,某个线程对象在启动之前,调用了setDaemon(true)语句,这个线程就变成了一个后台线程

    示例,Example06.java

    // 创建DamonThread类,实现Runnable接口

    class DamonThread implements Runnable{

    // 实现接口中的run()方法

    public void run(){

    while(true){

    System.out.println(Thread.currentThread().getName()+"---is running.");

    }

    }

    }

    public class Example06{

    public static void main(String[] args){

    System.out.println("main线程是后台线程吗?"+Thread.currentThread().isDaemon());

    // 创建一个DamonThread对象dt

    // 创建线程t,共享dt资源

    DamonThread dt=new DamonThread();

    Thread t=new Thread(dt,"后台线程");

    System.out.println("t线程默认是后台线程吗?"+t.isDaemon());

    // 将线程t,设置为后台线程

    // 调用start()方法,开启线程t

    t.setDaemon(true);

    t.start();

    for(int i=0;i<10;i++){

    System.out.println(i);

    }

    }

    }

    编译运行

    af11381652679c88378b64cf47308143.png

    演示了一个后台线程结束的过程

    当开启线程t之后,会执行死循环中的打印语句,我们将线程t设置为后台线程后,当前台线程死亡后,JVM会通知后台线程

    由于,后台线程从接受指令,到做出响应,需要一定的时间,因此,打印了几次后台线程—is running语句后,后台线程也结束了

    因此,说明后台线程在运行时,进程就结束了

    设置后台线程

    将某个线程设置为后台线程,必须在该线程启动之前 也就是说,setDaemon()方法必须在start()方法之前调用,否则,会引发IllegalTreadStateException异常

    展开全文
  • 前台线程和后台线程的理解

    千次阅读 2019-12-30 14:34:24
    线程有两种:前台线程和后台线程。 区别是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。 ...

    线程有两种:前台线程和后台线程。

    区别是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。

    主线程退出,不管后台线程有没有执行完,都会把后台线程结束掉:

     static void Main(string[] args)
            {
                Console.WriteLine("程序启动");
                Thread thread = new Thread(Worker);
                thread.Start();
                thread.IsBackground = true;
                Console.WriteLine("主线程退出");
                //Console.ReadKey();
            }
    
            static void Worker() {
                Thread.Sleep(1000);
                Console.WriteLine("后台线程退出");
            }

    以上代码运行结果为:

    首先通过Thread类创建了一个线程对象,然后通过IsBackground属性指明该线程为后台线程,启动了后台线程,主线程将会继续执行。主线程运行完毕之后就会中止后台线程,然后使整个程序结束运行。所以Worker不会执行。

    但是最后有Console.ReadKey();后台线程会执行,因为Console.ReadKey()就是在等待,只要超过1秒即后台线程就会执行Worker。

    在真正的开发环境中我们不可能通过加一句Console.ReadKey()来解决主线程退出后台线程还没执行这个问题,当然,我们还有其他的方法。

    方法一:将创建的线程设置为非后台线程(前台线程),只需要注释backThread.IsBackground = true即可;其实不设置IsBackground属性,默认为前台线程。只有前台程序全部执行完才会退出程序。所以子线程的代码会被执行,但是这个时候一执行完马上就退出程序了。

    代码和运行结果:

    方法二:就是使主线程在后台线程执行完毕之后再执行,即使主线程也进入睡眠,且使睡眠时间比后台线程更长

    代码和运行结果:

    方法三:使用函数Join来实现,确保主线程会在后台线程结束后才开始运行

    代码和运行结果:

    使用Join的时候,主线程会等待后台线程结束之后才能继续执行。另外Join方法还有一个参数,表示等待多长时间。如果设置了时间,等了这个时间还没执行完就不会再等了。比如这里设置为500,那么就可能等不了子线程的执行了。

    Demo链接:https://github.com/wangongshen/Wgs.CSDN.Demo2019

    展开全文
  • 另一个线程为前台线程,任务是线程开始,休眠10秒结束,当前台线程结束,计时线程也随之结束。 二、实现代码 public class SleepTest { public static void main(String[] args) { //创建计时线程 Thread ...
  • 前台线程:应用程序必须运行完所有的前台线程才能退出,默认创建的线程都是前台线程。 后台线程:应用程序可以不必考虑后台线程是否已经运行完毕(包括正常退出和异常退出),只要所有的前台线程结束,后台线程自动...
  • 1.线程分类 线程由程序员创建,可是创建的方式不同,总体来说有两种,一种是个人构造,也就是使用thread类new线程对象创建,这一类线程是大部分程序员知道的,也叫专用线程;...前台线程和后台线程 而从...
  • 先复习一下什么是线程 线程是程序执行的一条独立的执行路径。 而多线程,就是多个线程组成一个程序。 程序在执行时,即使自己没有定义线程,后台也会运行多个线程,比如main主线程 垃圾回收线程(每次程序运行 肯定...
  • //前台线程和后台线程唯一区别就是:应用程序必须运行完所有的前台线程才可以退出; //而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出, //所有的后台线程在应用程序退出时都会自动结束。 ...
  • C# 前台线程和后台线程的区别

    千次阅读 2019-06-05 16:31:51
    前台线程和后台线程唯一区别:应用程序必须运行完所有的前台线程才会完全退出,若前台线程未执行完成,关闭应用程序后,应用程序并没有完全退出,在任务管理器中还存在此进程;而对于后台线程,应用程序则可以不考虑...
  • 默认状态下手动创建线程都是前台线程 只要有前台线程在运行,那么程序会一直处于活跃状态. 但是后台线程却不行,一旦所有前台线程停止,那么应用程序就停止了,任何后台线程也会突然终止 注意:前台、后台状态与他的...
  • .Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其...
  • 一、Java 分为两种线程:用户线程和守护线程 所谓守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因 此,当所有...
  • 通过代码构造一个Thread对象显示的创建线程都是前台线程,通过线程池ThreadPool/Task创建的线程都是后台线程。 通过下面的代码可以感受下前台线程后台线程的区别。 static void Main(string[] args) {
  • 进程是线程的容器,一个C#客户端程序开始于一个单独的线程,CLR(公共语言运行库)为该进程创建了一个线程,该线程称为主线程。例如当我们创建一个C#控制台程序,程序的入口是Main()函数,Main()函数是始于一个主线程...
  • 默认情况下,你手动创建的线程都是前台线程。 只要由前台线程在运行,那么应用程序就会一直处于活动状态。 但是只有后台线程会跟着主线程结束而结束运行。 一旦所有的前台线程停止,那么应用程序就停止工作了。 注意...
  • 前台线程和后台线程的区别和联系

    千次阅读 2018-07-08 20:12:59
    main()函数即主函数,是一个前台线程,前台进程是程序中必须执行完成的,而后台线程则是java中所有前台结束后结束,不管有没有完成,后台线程主要用与内存分配等方面。 前台线程和后台线程的区别和联系:1、后台线程...
  • 默认情况下,我们显式创建的线程是前台线程。 只要前台线程中的任何一个正在运行,它就可以使应用程序保持活动状态,而后台线程则不会。 一旦所有前台线程完成,应用程序结束,所有仍在运行的后台线程终止。 您可以...
  • 2.我们默认创建的线程是前台线程,即主线程,Thread构造的线程。后台线程在线程池中。 3.java程序中,只要还有一个前台线程在运行,这个程序就不会结束,如果一个进程中只有后台线程运行,这个线程就结束了。 4.所有...
  • 线程10:前台线程和后台线程

    千次阅读 2018-06-08 23:48:28
    (我们默认创建的线程是“前台线程”)。2) 只有所有的前台线程都关闭后,系统才真正的关闭。后台线程,会随着所有前台线程的关闭而自动关闭。3) 后台线程不会阻止进程的中止。属于某个进程的所有前台线程都中止...
  • #系统里的守护进程一般以d为结尾的进程都是守护进程(daemon)如果有标准输出可以给重定向一下nohup ./a.out ...detach()=pthread_join()+系统自动帮你回收线程#查看当前的NPTL库版本(线程库版本)#创建多少个线程合适
  • CLR将每个线程要么视为前台线程,要么视为后台线程。一个进程的所有前台线程停止运行时,CLR强制终止仍在运行的任何后台线程。这些后台线程被直接终止;不抛出异常。 所以,应该用前台线程执行确实想要完成的任务,...
  • c#中的线程创建

    千次阅读 2021-09-01 10:17:44
    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace threadTest { class Program { static void Main(string[] args) ...//1创建线程对象
  • Java多线程线程创建与Thread类的使用

    千次阅读 多人点赞 2022-03-24 13:34:22
    本篇文章介绍java多线程中Thread类的使用以及有关线程对象创建和常用方法。
  • 在默认情况下,我们手动创建的线程都是前台线程,而只要有前台线程在运行,应用程序就会一直处在活跃的状态,当然,一旦所有前台线程都结束了,即便还有后台线程存在,应用程序也会结束。 此外,我们还要知道,前台...
  • C#扫盲之:前台线程后台线程1.线程分类线程由程序员创建,可是创建的方式不同,总体来说有两种,一种是个人构造,也就是使用thread类new线程对象创建,这一类线程是大部分程序员知道的,也叫专用线程;还有一种是由...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,648
精华内容 24,259
关键字:

创建前台线程