概述
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
最后
以上就是震动蜗牛为你收集整理的java主线程结束,其他线程并不终止的全部内容,希望文章能够帮你解决java主线程结束,其他线程并不终止所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复