java主线程结束,其他线程并不终止

main方法启动两个线程之后主线程结束,其他线程并不终止,网络依然在发送请求,输出依然存在。
正合我意。

public static void main(String[] args) {
// TODO Auto-generated method stub
fxframe mainframe=new fxframe();
mainframe.go();
}
public void go()
{
  buf1=new byte[5000];
  running = true;
  new Thread() {  
     public void run()
     {  
           readthread();
      };  
  }.start(); 
  new Thread() {  
      public void run()
     { 
          netwatch();
       };  
  }.start(); 
}
这里的问题是没有分清java的线程模型,jvm不区分主线程和用户线程,各个线程是独立的,不同与win32的线程模型。jvm把线程分为前台线程和后台线程,后台线程官方术语叫守护线程,jvm结束的条件是所有的前台线程结束。正常构建的线程都是前台线程,可以在线程未开始前调用Thread类的setDaemon(true)方法将线程改变为后台守护线程。具体运行模型见下例:
===============================================
/** 
* Java线程:线程的调度-守护线程 
* @author leizhimin 2009-11-4 9:02:40 
*/ 
public class Test { 
        public static void main(String[] args) { 
                Thread t1 = new MyCommon(); 
                Thread t2 = new Thread(new MyDaemon()); 
                t2.setDaemon(true);        //设置为守护线程 

                t2.start(); 
                t1.start(); 
        } 

class MyCommon extends Thread { 
        public void run() { 
                for (int i = 0; i < 5; i++) { 
                        System.out.println("线程1第" + i + "次执行!"); 
                        try { 
                                Thread.sleep(7); 
                        } catch (InterruptedException e) { 
                                e.printStackTrace(); 
                        } 
                } 
        } 

class MyDaemon implements Runnable { 
        public void run() { 
                for (long i = 0; i < 9999999L; i++) { 
                        System.out.println("后台线程第" + i + "次执行!"); 
                        try { 
                                Thread.sleep(7); 
                        } catch (InterruptedException e) { 
                                e.printStackTrace(); 
                        } 
                } 
        } 
}
==================================================
 运行结果:

后台线程第0次执行! 
线程1第0次执行! 
线程1第1次执行! 
后台线程第1次执行! 
后台线程第2次执行! 
线程1第2次执行! 
线程1第3次执行! 
后台线程第3次执行! 
线程1第4次执行! 
后台线程第4次执行! 
后台线程第5次执行! 
后台线程第6次执行! 
后台线程第7次执行! 

Process finished with exit code 0
=============================================
从上面的执行结果可以看出:
前台线程是保证执行完毕的,后台线程还没有执行完毕就退出了。
 
实际上:JRE判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态,因此,在使用后台县城时候一定要注意这个问题。
本例子出自“熔 岩”博客http://lavasoft.blog.51cto.com/62575/221845

转载于:https://www.cnblogs.com/bjguanmu/articles/4398144.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值