您的位置:首页 > 其它

守护进程与未捕获异常处理器

2016-12-09 16:55 218 查看
守护进程:
作用:后台管理者
比如你正在 用 Java 写成的编辑器 写 Word 文档,
例子:
你一边敲键盘,这是个 非守护线程, 后台还有一个 拼写检查 线程,它是个守护线程,他尽量不打扰你写稿子, 你们可以同时进行,他发现有拼写错误时在状态条显示错误,但是你可以忽略。
就像 城堡门前有个卫兵 (守护线程),里面有诸侯(非守护线程),他们是可以同时干着各自的活儿,但是 城堡里面的人都搬走了, 那么卫兵也就没有存在的意义了。
守护线程与普通线程的唯一区别是:当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则不会退出。(以上是针对正常退出,调用System.exit则必定会退出)
所以setDeamon(true)的唯一意义就是告诉JVM不需要等待它退出,让JVM喜欢什么退出就退出吧,不用管它。
用法:
1.thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常
2. 在Daemon线程中产生的新线程也是Daemon的。
3.不是所有的应用都可以分配给Daemon线程来进行服务,比如读写操作或者计算逻辑。因为在
Daemon Thread还没来的及进行操作时,虚拟机可能已经退出了。
示例:
//完成文件输出的守护线程任务
import java.io.*;
class TestRunnable implements Runnable{
public void run(){
try{
Thread.sleep(1000);//守护线程阻塞1秒后运行
File f=new File("daemon.txt");
FileOutputStream os=new FileOutputStream(f,true);
os.write("daemon".getBytes());
}
catch(IOException e1){
e1.printStackTrace();
}
catch(InterruptedException e2){
e2.printStackTrace();
}
}
}
public class TestDemo2{
public static void main(String[] args) throws InterruptedException
{
Runnable tr=new TestRunnable();
Thread thread=new Thread(tr);
thread.setDaemon(true); //设置守护线程
thread.start(); //开始执行分进程
}
}

运行结果:文件daemon.txt中没有"daemon"字符串。
但是如果把thread.setDaemon(true); //设置守护线程注释掉,文件daemon.txt是可以被写入daemon字符串的
未捕获异常处理器:
首先弄懂什么是检查型异常什么又是非检查型异常呢?
最简单的判断点有两个:
1.继承自runtimeexception或error的是非检查型异常,而继承自exception的则是检查型异常(当然,runtimeexception本身也是exception的子类)。
2.对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。
正文:
线程run 方法不能抛出任何受检查型异常,但是,非检查异常查会导致线程终止。
但是,不需要任何catch子句来处理可以被传播的异常。相反,在线程死亡之前,异常被传递到一个用于未捕获异常的处理器。
该处理器必须是想一个Thread.UncaughtExceptionHandler接口的类,这个接口只有一个方法。
void uncaughtExceptionh(Thread t,Throwable e)
可以用setUncaughtExceptionHandler方法为任何线程安装一个处理器。
一可以用Thread类的静态方法setDefaultUncaughtExceptionHandler为所有线程安装一个默认的处理器。替换处理器可以使用日志API发送未捕获异常到日志文件。
如果不安装默认的处理器,默认的处理器为空。但是,如果不为独立的线程安装处理器,此时的处理器就是该线程的ThreadGroup对象。
java.lang.ThreadGroup 类uncaughtException默认实现的逻辑如下:
如果父线程组存在, 则调用它的uncaughtException方法.
如果父线程组不存在, 但指定了默认处理器 (下节中的As the default handler for the application), 则调用默认的处理器
如果默认处理器没有设置, 则写错误日志.但如果 exception是ThreadDeath实例的话, 忽略。
样例看这里:
https://my.oschina.net/shishaomeng/blog/121740
参考博客:
https://my.oschina.net/shishaomeng/blog/121740
http://blog.csdn.net/yixiaoqingyuz/article/details/4485606
http://bbs.csdn.net/topics/80298851
http://www.cnblogs.com/super-d2/p/3348183.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: