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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴璞玉 黑马帝   /  2012-2-9 21:42  /  3256 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吴璞玉 于 2012-2-10 14:29 编辑


一个买票的小程序,本身运行起来无法自动停止,可否将t1,t2两个线程设为守护线程?
设置成守护线程会如何?为什么?

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

4 个回复

倒序浏览
可以的。
t1.strart();
t2.setDaemon(true);
t2.strart();
将t2设成守护线程,当正在运行的线程都是守护线程时,虚拟机退出。达到了停止的作用。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
线程调用 的意义在于JVM应对运行的多个线程进行系统级的协调,以避免多个线程争用有限资源而导致应用系统死机或者崩溃。
为了线程对 于操作系统和用户的重要性区分开,Java定义了线程的优先级策略。Java将线程的优先级分为10个等级,分别用1-10之间的数字表示。数字越大表明 线程的级别越高。相应地,在Thread类中定义了表示线程最低、最高和普通优先级的成员变量MIN_PRIORITY、MAX_PRIORITY和 NORMAL_PRIORITY,代表的优先级等级分别为1、10和5。当一个线程对象被创建时,其默认的线程优先级是5。

在Java中比较特殊的线程是被称为守护(Daemon)线程的低级别线 程。这个线程具有最低的优先级,用于为系统中的其它对象和线程提供服务。将一个用户线程设置为守护线程的方式是在线程对象创建之前调用线程对象的 setDaemon方法。典型的守护线程例子是JVM中的系统资源自动回收线程,它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。

你的程序中可以设置成守护线程
t1.strart();
t1.setDaemon(true);
但是,你还要做出判断,当票数为0的时候,你要确定那个线程是守护线程,然后退出虚拟机。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
不知道楼主尝试了没有将你的程序里的线程设置为守护线程,我试过之后发现并不能解决程序无法结束的问题
我认为要解决你程序的问题 并不适合将线程设置为守护的 因为所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。且守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。而你的程序中当ticket==0时,无论此时执行的是守护线程还是用户线程 总之用户线程总是呆在while(true)循环里无法结束 这样不管是不是把某个线程设置为守护线程 程序还是无法结束
其实你只需要在
  1. if(ticket > 0){
  2.                                 try
  3.                                 {
  4.                                         Thread.sleep(10);
  5.                                 }
  6.                                 catch(Exception e)
  7.                                 {}
  8.                                 System.out.println(Thread.currentThread().getName() + ".....sale" + ticket--);
  9. }
复制代码
后面加上一句
  1. else
  2. break;
复制代码
你的问题就解决了 并不需要设置守护线程 或者说设置了也是没用的

加个例子
  1. class Demo
  2. {


  3.         public static void main(String[] args)
  4.         {

  5.                 int n = 100;
  6.                 while(true)
  7.                 {
  8.                         if(n>0)
  9.                         {
  10.                                 System.out.println(n--);
  11.                         }
  12.                         /*
  13.                         else
  14.                                 break;
  15.                         */如果这里注释掉了 程序就无法结束了
  16.                          
  17.                 }
  18.         }
  19. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
尹旗龙 发表于 2012-2-10 16:16
不知道楼主尝试了没有将你的程序里的线程设置为守护线程,我试过之后发现并不能解决程序无法结束的问题
我 ...

当然是实验了,但是我不太明白是什么原因所以才问的{:3_52:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马