(15)21.2.8 后台线程

21.2.8后台线程
1. 后台线程定义:
     后台线程:是指在程序运行的时候在后台踢狗一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分。因此,当程序的非后台线程结束时,程序也就终止了,同事会杀死进程中所有的后台线程。反过来说,只要有非后台线程在运行,程序就不会终止。如:main就是一个非后台线程。
例如:
package jiangning.c21;

import java.util.concurrent.TimeUnit;

public class SimpleDeamons implements Runnable {

       @Override
       public void run() {
             try {
                  TimeUnit. MILLISECONDS.sleep(100);
                  System. out.println(Thread.currentThread() + " : " + this);
            } catch (InterruptedException e) {
                  System. out.println("sleep() interrupted" );
            }
      }

       public static void main(String[] args) throws Exception {
             for(int i = 0; i < 10; i++ ){
                  Thread daemon = new Thread(new SimpleDeamons());//创建线程
                  daemon.setDaemon( true);//设置线程为后台线程
                  daemon.start(); //启动线程
            }
            System. out.println("All daimons started" );
            TimeUnit. MILLISECONDS.sleep(175);
      }
}

/**
All daimons started
*/
解释:
1). 必须在线程启动前调用setDaemon()方法,才能设置为后台线程。
一旦main()完成其工作,就没有什么能阻止程序终止,因为除了后台线程之外,已经没有线程在运行了,因main()方法被设置为短暂休眠,所以可以看到后台线程启动的结果。
2).去掉休眠时间后执行结果:
/**
All daimons started
Thread[Thread -9,5,main] : jiangning.c21.SimpleDeamons@1ce2dd4
Thread[Thread -7,5,main] : jiangning.c21.SimpleDeamons@65a77f
Thread[Thread -0,5,main] : jiangning.c21.SimpleDeamons@1c99159
Thread[Thread -3,5,main] : jiangning.c21.SimpleDeamons@11f2ee1
Thread[Thread -2,5,main] : jiangning.c21.SimpleDeamons@a61164
Thread[Thread -4,5,main] : jiangning.c21.SimpleDeamons@3ecfff
Thread[Thread -5,5,main] : jiangning.c21.SimpleDeamons@12f0999
Thread[Thread -1,5,main] : jiangning.c21.SimpleDeamons@1ef9157
Thread[Thread -6,5,main] : jiangning.c21.SimpleDeamons@122cdb6
Thread[Thread -8,5,main] : jiangning.c21.SimpleDeamons@1d7ad1c
*/
看不到线程启动。
2. 通过编写定制的ThreadFactory可以定制由Executor创建的线程属性。
如:
package net.mindview.util;
import java.util.concurrent.*;

public class DaemonThreadFactory implements ThreadFactory {
  public Thread newThread(Runnable r) {
    Thread t = new Thread(r);
    t.setDaemon(true);
    return t;
  }
}


package jiangning.c21;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import net.mindview.util.DaemonThreadFactory;

public class DaemonFromFactory implements Runnable{

       public void run(){
             try {
                  TimeUnit. MILLISECONDS.sleep(100);
                  System. out.println(Thread.currentThread() + " : " + this);
            } catch (InterruptedException e) {
                  System. out.println("interrupted" );
            }
      }
       public static void main(String[] args) throws Exception {
            ExecutorService exec = Executors. newCachedThreadPool(new DaemonThreadFactory());
             for(int i = 0; i < 10; i++){
                  exec.execute( new DaemonFromFactory());
            }
            System. out.println("All daemons started" );
            TimeUnit. MILLISECONDS .sleep(500);
      }
} 

3.判读是否为后台线程的方法:用isDaemon()。
如果是一个后台线程,那么由它创建的线程都是后台线程。
package jiangning.c21;

import java.util.concurrent.TimeUnit;

class Daemon implements Runnable{
       private Thread[] t = new Thread[10];
       @Override
       public void run() {
             for(int i = 0; i<t.length; i++){
                   t[i] = new Thread(new DaemonSpawn());
                   t[i].start();
                  System. out.println("DaemonSpawn " + i + " started" );//打印出执行了那个线程
            }
             for(int i = 0; i < t.length; i++){
                  System. out.println("t[" + i + "].isDaemon " +t[i].isDaemon());//打印线程是否为后台线程
            }
             while(true ){
                  Thread. yield();
            }
      }
}

class DaemonSpawn implements Runnable{
       public void run(){
             while(true ){
                  Thread. yield();
            }
      }
}

public class Daemons {
       public static void main(String[] args) throws Exception {
            Thread d = new Thread(new Daemon());
            d.setDaemon( true);
            d.start();
            System. out.println("d.isDaemon()= " + d.isDaemon()+",");
            TimeUnit. MILLISECONDS.sleep(1);
      }
}
/**
d.isDaemon()= true,
DaemonSpawn 0 started
DaemonSpawn 1 started
DaemonSpawn 2 started
DaemonSpawn 3 started
DaemonSpawn 4 started
DaemonSpawn 5 started
DaemonSpawn 6 started
DaemonSpawn 7 started
DaemonSpawn 8 started
DaemonSpawn 9 started
t[0].isDaemon true
t[1].isDaemon true
t[2].isDaemon true
t[3].isDaemon true
t[4].isDaemon true
t[5].isDaemon true
t[6].isDaemon true
t[7].isDaemon true
t[8].isDaemon true
t[9].isDaemon true
*/
解释:
Thread d = new Thread( new Daemon());
            d.setDaemon( true );
创建Daemon对象d为后台线程。
所以在d中创建的线程都是后台线程。

4.后台线程在不执行finally子句的情况下终止run()方法。
例子:
package jiangning.c21;

import java.util.concurrent.TimeUnit;
/**
 * finally子句不会执行。
 * @author jn
 *
 */
class ADaemon implements Runnable{
       @Override
       public void run() {
             try {
            System. out.println("ADaemon started" );
                  TimeUnit. MILLISECONDS.sleep(1);
            } catch (InterruptedException e) {
                  e.printStackTrace();
            } finally{
                  System. out.println("This should always run?" );
            }
      }
}
public class DaemonsDonotRunFinally {
       public static void main(String[] args) {
            Thread t = new Thread(new ADaemon());
            t.setDaemon( true);
            t.start();
      }
}

/**
 * ADaemon started
 */
总结:
1)后台线程的定义及如何设置后台线程。
2)通过创建后台线程
3)判断是否为后台线程
4)后台线程可以不执行finally而终止run()方法。


### 回答1: DevExpress是一家软件开发工具公司,他们提供了各种用于创建高性能、交互性及数据驱动的应用程序的开发工具。其中,DevExpress Universal是他们的主要产品之一。 在提到devexpress.universal.21.2.6时,它指的是DevExpress在2021年第2个季度发布的软件版本号为21.2.6的Universal套件。 这个版本的Universal套件包含了各种用于开发Windows、Web、移动和云平台应用程序的工具。它提供了丰富的控件、组件和库,可以简化开发人员的工作并提高应用程序的质量和性能。 devexpress.universal.21.2.6具有许多新的功能和改进,以及修复了之前版本中的一些问题。开发人员可以通过使用这个版本的Universal套件,来构建现代化的应用程序,实现自定义界面、数据可视化、数据分析、报表生成等功能。 除了功能上的改进,DevExpress还为开发人员提供了一流的技术支持和文档,以帮助他们更好地使用Universal套件。开发人员可以通过DevExpress的官方网站和论坛,获取到最新的教程、示例代码和技术文档,以便更好地利用devexpress.universal.21.2.6来开发自己的应用程序。 总而言之,devexpress.universal.21.2.6是DevExpress公司发布的一个基于21.2.6版本的Universal套件,它提供了丰富的开发工具和功能,帮助开发人员构建高性能和易于维护的应用程序。无论是Windows、Web、移动还是云平台,都可以使用这个版本的Universal套件来创建现代化的应用程序。 ### 回答2: devexpress.universal.21.2.6是DevExpress公司所提供的一款软件开发工具包。DevExpress是一家专注于开发软件开发工具和应用解决方案的国际知名公司,该公司提供了许多面向不同平台的开发工具。 devexpress.universal.21.2.6是该公司的一款全球通用的开发工具包,适用于各种不同的开发环境和平台,包括Windows、Web和移动应用等。该工具包提供了丰富的控件库和解决方案,可以帮助开发人员快速构建功能强大、界面美观的应用程序。 devexpress.universal.21.2.6具有很多优点。首先,它可以与不同的开发环境和编程语言集成,如C#、VB.NET等,方便开发人员使用。其次,该工具包拥有丰富的控件库,包括图表、报表、网格和文本编辑等控件,可以满足开发人员在不同项目中的需要。此外,devexpress.universal.21.2.6还提供了许多高效的功能和工具,如数据绑定、布局管理和样式定制等,可以提高开发效率和应用质量。 总而言之,devexpress.universal.21.2.6是一款功能强大、易于使用的开发工具包,适用于各种开发项目。它能够帮助开发人员快速构建出高质量、用户友好的应用程序,提升开发效率和开发质量。 ### 回答3: DevExpress Universal 21.2.6 是DevExpress公司为.NET开发人员提供的一套综合性开发工具包。它提供了丰富而强大的功能,帮助开发人员快速构建高性能、现代化的跨平台应用程序。 DevExpress Universal 21.2.6 提供了一个全面的控件库,包括数据展示控件、数据输入控件、布局和导航控件、报表和分析控件等等。这些控件具有高度的可定制性和灵活性,开发人员可以根据自己的需求进行定制。控件库支持多种UI技术,包括Windows Forms、WPF、ASP.NET、ASP.NET Core等,以及跨平台开发框架Blazor。 除了控件库,DevExpress Universal 21.2.6 还提供了许多其他的工具和组件,帮助开发人员提高生产效率。其中包括代码编辑器、调试器、性能分析工具、报表设计器等等。这些工具能够简化开发过程,提供更好的开发体验。 DevExpress Universal 21.2.6 还提供了丰富的文档和示例代码,帮助开发人员更好地了解和使用各种功能。开发人员可以通过官方网站获得相关文档和示例代码,也可以参加官方举办的培训和研讨会,与其他开发人员进行交流和分享经验。 总之,DevExpress Universal 21.2.6 是一套功能强大、易于使用的开发工具包,能够帮助开发人员快速构建高质量的跨平台应用程序。无论是初学者还是经验丰富的开发人员,都可以从中受益。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值