疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java开发守护线程和线程组


 

   

  守护线程

  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()方法可以设定线程组中的所有线程拥有最大的优先权。