A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘勇强 中级黑马   /  2013-3-9 13:43  /  1671 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘勇强 于 2013-3-9 13:45 编辑
  1. class MyThread implements Runnable{        
  2.         public void run(){        
  3.                 while(true){
  4.                         System.out.println(Thread.currentThread().getName() + "在运行。") ;
  5.                 }
  6.         }
  7. };
  8. public class ThreadDaemonDemo{
  9.         public static void main(String args[]){
  10.                 MyThread mt = new MyThread() ;        
  11.                 Thread t = new Thread(mt,"线程");               
  12.                 t.setDaemon(true) ;        // 此线程在后台运行
  13.                 t.start() ;        // 启动线程
  14.         }
  15. };
复制代码
运行了n遍,总没有任何输出. 为什么守护线程没有输出呢?

评分

参与人数 1技术分 +1 收起 理由
高境 + 1 赞一个!

查看全部评分

5 个回复

正序浏览
你用了setDeamon  就该知道  当程序  只有守护线程就会自动停止    当主线程一执行完 t.start();  主线程就执行完了  程序就结束了   守护线程就执行不到了   就这么简单
回复 使用道具 举报
机器有点卡,再发下代码
  1. class MyThread implements Runnable{        
  2.         public void run(){        
  3.                 while(true){
  4.                         System.out.println(Thread.currentThread().getName() + "在运行。") ;
  5.                 }
  6.         }
  7. };
  8. public class ThreadDaemonDemo{
  9.         public static void main(String args[]){
  10.                 MyThread mt = new MyThread() ;        
  11.                 Thread t = new Thread(mt,"线程");               
  12.                 t.setDaemon(true) ;        // 此线程在后台运行
  13.                 t.start() ;        // 启动线程
  14. //延长主线程执行时间
  15.                                 try
  16.                                 {
  17.                                         Thread.sleep(1000);
  18.                                 }
  19.                                 catch (InterruptedException e)
  20.                                 {
  21.                                 }

  22.         }
  23. };
复制代码
回复 使用道具 举报
机器有点卡,再发下代码
  1. class MyThread implements Runnable{        
  2.         public void run(){        
  3.                 while(true){
  4.                         System.out.println(Thread.currentThread().getName() + "在运行。") ;
  5.                 }
  6.         }
  7. };
  8. public class ThreadDaemonDemo{
  9.         public static void main(String args[]){
  10.                 MyThread mt = new MyThread() ;        
  11.                 Thread t = new Thread(mt,"线程");               
  12.                 t.setDaemon(true) ;        // 此线程在后台运行
  13.                 t.start() ;        // 启动线程
  14. //延长主线程执行时间
  15.                                 try
  16.                                 {
  17.                                         Thread.sleep(1000);
  18.                                 }
  19.                                 catch (InterruptedException e)
  20.                                 {
  21.                                 }

  22.         }
  23. };
复制代码
回复 使用道具 举报
  1. public class ThreadDaemonDemo{
  2.         public static void main(String[] args){
  3.                 MyThread mt = new MyThread() ;        
  4.                 Thread t = new Thread(mt,"线程fffff");               
  5.                 t.setDaemon(true) ;        // 此线程在后台运行
  6.                 t.start() ;        // 启动线程
  7.              //延长主线程执行时间
  8.                                 try
  9.                                 {
  10.                                         Thread.sleep(1000);
  11.                                 }
  12.                                 catch (InterruptedException e)
  13.                                 {
  14.                                 }

  15.                 }
  16.                
  17.         }
  18. }
复制代码
是这样的,在你这段代码有两个线程,一个是自定义守护线程,一个是主线程(前台线程),而守护线程执行的代码是主线程的最后一行代码,即在守护线程还没得到执行权的时候,主线程很大几率可能就已经结束了,前台线程都结束了,守护线程自然会结束,不管它有没有执行。若想执行守护线程代码内容,可通过延长主线程执行线程来实现,所以我在上面的代码了,让主线程sleep了一下。
回复 使用道具 举报
  1. public class ThreadDaemonDemo{
  2.         public static void main(String[] args){
  3.                 MyThread mt = new MyThread() ;        
  4.                 Thread t = new Thread(mt,"线程fffff");               
  5.                 t.setDaemon(true) ;        // 此线程在后台运行
  6.                 t.start() ;        // 启动线程
  7.                 int sum =0;
  8.                 for(int i=1;i<1000000;i++){
  9.                         sum +=i;
  10.                 }
  11.                
  12.         }
  13. }
复制代码
将该线程标记为守护线程或用户线程。将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。该方法必须在启动线程前调用。
当标记为守护线程时,由于你的代码主线程已经执行完了,而守护线程在这个过程中又没有抢到执行权,所以没有打印任务东西
将你的代码加入一些代码,让主线程多运行一会,就可以看到守护线程执行的东西了
守护线程的特点是开启后和其他线程共同抢夺CPU的执行权
开启和运行,和其他线程都没有区别,唯一的区别是当前台线程结束后守护线程也就结束了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马