守护线程和线程组

守护线程

Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)

用户线程即运行在前台的线程,而守护线程是运行在后台的线程。 守护线程作用是:为其他前台线程的运行提供便利服务,而且仅在普通、非守护线程仍然运行时才需要,比如垃圾回收线程就是一个守护线程。当VM检测仅剩一个守护线程,而用户线程都已经退出运行时,VM就会退出,因为没有了用户线程被守护这,也就没有继续运行程序的必要了。如果有非守护线程仍然存活,VM就不会退出。

即如果所有的非后台线程结束了,则后台线程也会自动终止。

守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程。用户可以用Thread的setDaemon(true)方法设置当前线程为守护线程。用Thread的isDaemon()方法可以检测此线程是否为守护线程。

package com.wrh.threadInterrupt;
/*
 * 设定一个守护线程
 * */
public class DaemonThread extends Thread {
    public DaemonThread(){
        this.setDaemon(true);//设置此线程为守护线程
        this.start();

    }
    public static void main(String[] args) {
        Thread t=new DaemonThread();
        System.out.println(t.isDaemon());
    }

}

虽然守护线程可能非常有用,但必须小心确保其他所有非守护线程消亡时,不会由于它的终止而产生任何危害。因为你不可能知道在所有的用户线程退出运行前,守护线程是否已经完成了预期的服务任务。一旦所有的用户线程退出了,虚拟机也就退出运行了。 因此,不要在守护线程中执行业务逻辑操作(比如对数据的读写等)。

另外有几点需要注意:

1、setDaemon(true)必须在调用线程的start()方法之前设置,否则会跑出IllegalThreadStateException异常。

2、在守护线程中产生的新线程也是守护线程。  
3、 不要认为所有的应用都可以分配给守护线程来进行服务,比如读写操作或者计算逻辑。

线程组

在Java中每一个线程都归属于某个线程组管理的一员,例如在主函数main()工作流程中产生一个线程,则产生的线程属于main这个线程组管理的一员。简单地说,线程组就是由线程组成的管理线程的类,
这个类是java.lang.ThreadGroup类。
可以通过使用如下代码获取此线程所属线程组的名称。

Thread.currentThread().getThreadGroup().getName();

Thread.currentThread():为取得当前线程。
getThreadGroup():取得当前线程所在的组。
getName():取得组的名称。

定义一个线程组,通过以下代码可以实现。

ThreadGroup group=new ThreadGroup("group");
Thread t=new Thread(group,"thread----wuranghao");

具体实例代码如下:

package com.wrh.threadInterrupt;
/*
 * 设定一个守护线程
 * */
public class DaemonThread extends Thread {
    public DaemonThread() {
        super();
        this.setDaemon(true);
        this.start();
    }

    public static void main(String[] args) {
        DaemonThread t=new DaemonThread();  
        System.out.println(t.isDaemon());
        System.out.println(Thread.currentThread().getThreadGroup().getName());
        System.out.println(t.getThreadGroup().getName());
    }

}
/*
结果输出:
main
main
//此种情况下说明:main线程和开启的子线程属于main线程组中。
*/
package com.wrh.threadInterrupt;
/*
 * 设定一个守护线程
 * */
public class DaemonThread extends Thread {
    public DaemonThread(ThreadGroup group, String name) {
        super(group, name);
        this.setDaemon(true);
        this.start();
    }

    public static void main(String[] args) {
        ThreadGroup group=new ThreadGroup("thread group-1");
        DaemonThread t=new DaemonThread(group,"first thread in group-1");

        System.out.println(t.isDaemon());
        System.out.println(Thread.currentThread().getThreadGroup().getName());
        System.out.println(t.getThreadGroup().getName());
    }

/*
结果输出:
main
thread  group-1
*/  
//从结果可以看出,通过设置之后,线程就属于不同的线程组中了。

}

ThreadGroup类中的某些方法,可以对线程组中的线程产生作用。例如,setMaxPriority()方法可以设定线程组中的所有线程拥有最大的优先权。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值