黑马程序员技术交流社区

标题: 线程保护问题 [打印本页]

作者: 黄湘怡    时间: 2011-12-25 19:04
标题: 线程保护问题
本帖最后由 黄湘怡 于 2011-12-26 20:15 编辑

线程中的setDaemon到底有什么用呢?
  1. package cn.thread;

  2. public class Demo8 {

  3.         /**
  4.          * @param args
  5.          * @throws InterruptedException
  6.          */
  7.         public static void main(String[] args) throws InterruptedException {
  8.                 // TODO Auto-generated method stub
  9.                 ThTest th = new ThTest();
  10.                
  11.                
  12.                 Thread t = new Thread(new Runnable(){
  13.                         public void run(){
  14.                                 for(int x = 0;x<10;x++){
  15.                                         System.out.println("x = "+x);
  16.                                         try {
  17.                                                 Thread.sleep(1000);
  18.                                         } catch (InterruptedException e) {
  19.                                                 // TODO Auto-generated catch block
  20.                                                 e.printStackTrace();
  21.                                         }
  22.                                 }
  23.                         }
  24.                 });
  25.                
  26.                 for(int m = 0;m<5;m++){
  27.                         System.out.println("m = "+m);
  28.                         Thread.sleep(1000);
  29.                 }
  30.                
  31.                 t.setDaemon(true);
  32.                 th.setDaemon(true);
  33.                 t.start();
  34.                 th.start();
  35.                
  36.         }       
  37.                
  38. }

  39. class ThTest extends Thread{
  40.         public void run(){
  41.                 for(int i = 0;i<10;i++){
  42.                         System.out.println("i = "+i);
  43.                         try {
  44.                                 Thread.sleep(1000);
  45.                         } catch (InterruptedException e) {
  46.                                 // TODO Auto-generated catch block
  47.                                 e.printStackTrace();
  48.                         }
  49.                 }
  50.         }
  51. }
复制代码
运行的结果是:
m = 0
m = 1
m = 2
m = 3
m = 4
x = 0
i = 0

当for循环结束时,两个线程都都结束了,那写上有什么用呢?
作者: 刘海涛    时间: 2011-12-25 20:54
本帖最后由 刘海涛 于 2011-12-25 20:56 编辑


守护线程:
1. setDaemon需要在start方法调用之前使用
2. 线程划分为用户线程和后台(daemon)进程,setDaemon将线程设置为后台进程
3. 如果jvm中都是后台进程,当前jvm将exit。(随之而来的,所有的一切烟消云散,包括后台线程啦)
4. 主线程结束后,
      1) 用户线程将会继续运行
      2) 如果没有用户线程,都是后台进程的话,那么jvm结束
另外:
setDaemon方法把java的线程设置为守护线程,此方法的调用必须在线程启动之前执行。只有在当前jvm中所有的线程都为守护线程时,jvm才会退出。
  1. package com.itheima.bbs;

  2. public class Demo8 {

  3.         /**
  4.          *
  5.          * @param args
  6.          *
  7.          * @throws InterruptedException
  8.          */

  9.         public static void main(String[] args) throws InterruptedException {

  10.                 // TODO Auto-generated method stub

  11.                 ThTest th = new ThTest();
  12.                 Thread t = new Thread(new Runnable() {
  13.                         public void run() {
  14.                                 for (int x = 0; x < 10; x++) {
  15.                                         System.out.println("x = " + x);
  16.                                         try {
  17.                                                 Thread.sleep(1000);
  18.                                         } catch (InterruptedException e) {
  19.                                                 e.printStackTrace();

  20.                                         }
  21.                                 }
  22.                         }
  23.                 });

  24.                 t.setDaemon(true);
  25.                 th.setDaemon(true);
  26.                 t.start();
  27.                 th.start();
  28.                 for (int m = 0; m < 5; m++) {
  29.                         System.out.println("m = " + m);
  30.                         Thread.sleep(1000);
  31.                 }
  32.         }
  33. }

  34. class ThTest extends Thread {

  35.         public void run() {
  36.                 for (int i = 0; i < 10; i++) {
  37.                         System.out.println("i = " + i);
  38.                         try {
  39.                                 Thread.sleep(1000);
  40.                         } catch (InterruptedException e) {
  41.                                 e.printStackTrace();
  42.                         }
  43.                 }
  44.         }
  45. }
复制代码
输出结果:
m = 0
i = 0
x = 0
m = 1
i = 1
x = 1
m = 2
i = 2
x = 2
i = 3
m = 3
x = 3
m = 4
i = 4
x = 4
i = 5
x = 5

作用是可以让一个用户线程去控制jvm的退出,守护线程只能执行jvm退出之前的操作。
作者: 黄湘怡    时间: 2011-12-26 20:11
恩,知道了,谢谢你了~!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2