守护进程与未捕获异常处理器
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还没来的及进行操作时,虚拟机可能已经退出了。
示例:
//完成文件输出的守护线程任务
运行结果:文件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
作用:后台管理者
比如你正在 用 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
相关文章推荐
- 写一个Windows上的守护进程(7)捕获异常并生成dump
- 线程的属性(优先级、守护线程、未捕获异常处理器)
- SuseLinux上配置Telnet服务,重启xinetd守护进程时的异常
- 输出OTHERS异常处理器捕获的错误代码及错误描述信息
- windows下捕获dump之守护进程
- nodejs使用domain捕获工作进程异常
- 处理器管理(异常与中断以及进程调度)
- windows下捕获dump之守护进程
- ACL编程之父子进程机制,父进程守护子进程以防止子进程异常退出
- 捕获由于无效指针导致的内存读写异常,最后导致进程异常中止(仅适用于Windows系统)
- ACL编程之父子进程机制,父进程守护子进程以防止子进程异常退出
- 全局异常捕获处理器
- erlang进程trap_exit捕获异常退出
- 连续捕获程序异常的处理器异常测试方法
- windows下捕获dump之守护进程
- android捕获子进程的异常操作
- [置顶] ACL编程之父子进程机制,父进程守护子进程以防止子进程异常退出
- Android 之设置未捕获异常处理器
- ACL编程之父子进程机制,父进程守护子进程以防止子进程异常退出
- android守护进程,进入后台或异常后再次启动app