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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王雷1 中级黑马   /  2013-11-27 10:49  /  1398 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.io.*;
class test5
{
public static void main(String[] args)throws IOException
{
  san s=new san();
  Thread t1=new Thread(s);
  Thread t2=new Thread(s);
  t1.setDaemon(true);
  t2.setDaemon(true);
  t1.start();
  t2.start();
  System.out.println(Thread.currentThread().getName());
  //当主线程读到这个打印语句时是前台线程,因为有上面的守护线程,
  //所以为什么前台线程的主线程结束而后台线程没有跟着一起死亡
} //还是我根本理解的不对?
}
class san implements Runnable{
public void run(){
  for(int x=0;x<30;x++)System.out.println(Thread.currentThread().getName()+":::::"+x);
}
}

4 个回复

倒序浏览
你所说的问题是为什么在前台线程结束后,后台线程还在打印东西,是吧?
在你的代码中后台线程确实已经在前台线程结束后结束了,而还在打印的东西是后台线程在前台线程还未结束是就已经运算完未来得及打印的。
可以通过下面的代码进行验证。
  1. import java.io.*;
  2. class test5
  3. {
  4. public static void main(String[] args)throws IOException
  5. {
  6.    san s=new san();
  7.    Thread t1=new Thread(s);
  8.    Thread t2=new Thread(s);
  9.    t1.setDaemon(true);
  10.    t2.setDaemon(true);
  11.    t1.start();
  12.    t2.start();
  13.    try{Thread.sleep(10);}catch(Exception e){}
  14.    System.out.println(Thread.currentThread().getName());
  15. }
  16. class san implements Runnable{
  17. public void run(){
  18.    for(int x=0;x<300;x++)
  19.         System.out.println(Thread.currentThread().getName()+":::::"+x);
  20.         }
  21. }
复制代码
回复 使用道具 举报
樊志伟 发表于 2013-11-27 11:12
你所说的问题是为什么在前台线程结束后,后台线程还在打印东西,是吧?
在你的代码中后台线程确实已经在前 ...

呵呵,非常感谢
回复 使用道具 举报
可能你主线程是结束一瞬间, 两个后台程序就运行完, 你把那个x取值范围调到1000这时两个后台程序就会运行一半就会结束
回复 使用道具 举报
同学、问题已经解决了吗?
如果没有、就去新版28期问吧,26~27已经结束了。开班了!
http://bbs.itheima.com/forum-165-1.html

如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
如果没有解决,可能你的问题问得不够清楚。可以重新发问的哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马