Java 一个简单的线程定时 (守护线程)
2016-12-01 14:11
218 查看
守护线程也叫精灵线程: 当程序只剩下守护线程的时候 ,程序就会退出。
守护线程的作用类似在后台静默执行,比如JVM的垃圾回收机制。
应用场景:实例化socket连接时需要判断连接成功与否,一般来说,如果连接成功就是片刻的事,如果不成功的话jvm会判断20s时间,才会抛出超时异常,对于体验来说实在是太差了,所以就需要自定义他运行时间,超过时间(比如2s)就抛出异常,终止程序。
主代码:
TimeoutThreadDemo.java
未使用守护线程前运行结果:
运行时间20s
使用后运行结果:
抛出自定义异常
守护线程的作用类似在后台静默执行,比如JVM的垃圾回收机制。
应用场景:实例化socket连接时需要判断连接成功与否,一般来说,如果连接成功就是片刻的事,如果不成功的话jvm会判断20s时间,才会抛出超时异常,对于体验来说实在是太差了,所以就需要自定义他运行时间,超过时间(比如2s)就抛出异常,终止程序。
主代码:
TimeoutThreadDemo.java
public class TimeoutThreadDemo extends Thread{ private long timeout; private boolean isCanceled = false; private TimeoutException timeoutException; public TimeoutThreadDemo(long timeout,TimeoutException timeoutErr){ this.timeout = timeout; //超时时长 this.timeoutException = timeoutErr;//抛出自定义异常 this.setDaemon(true); //设置成为守护线程 } public synchronized void cancel(){ isCanceled = true; } public void run(){ try{ Thread.sleep(timeout);//线程休眠2s后运行 if(!isCanceled) throw timeoutException; }catch(InterruptedException e){ e.printStackTrace(); } } public static void main(String[] args) { TimeoutThreadDemo t = new TimeoutThreadDemo(2000,new TimeoutException("超时啦!")); //2000为2s,这里需要设置多少自行输入 try{ t.start(); /* 这里需要说明一下,t.start()和t.cancel()之间是我们要操作定时完成的对象,t.start()线程运行,我们规定的是让它先休眠2s,接下来执行我们的操作,如果我们的操作2s内执行完毕,就执行t.cancel()把isCancel参数设置为true,跳出异常抛出操作。反之,2s内我们的操作未完成,则t.start()的2s时间到了,t.cancel()未执行,isCancel未更改就会执行异常抛出操作了 */ Thread thread = new Thread(){ @Override public void run() { // TODO Auto-generated method stub /*这里请注意,新开线程只是为了使用thread.sleep();方法 从而实现超时目的,不能在本线程中进行耗时操作,比如实例化socket(系统默认20s超时时间),新开线程的话不在超时监测线程中作业,就达不到监测目的 */ } }; try { thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } thread.start(); t.cancel();//更改isCanccel的值 }catch (TimeoutException e) { e.printStackTrace();} } } //自定义异常类 class TimeoutException extends RuntimeException{ private static final long serialVersionUID = -8078853655388692688L; public TimeoutException(String errMessage){ super(errMessage); } }
未使用守护线程前运行结果:
运行时间20s
使用后运行结果:
抛出自定义异常
相关文章推荐
- 自制简单的Java下载器——来自《Java高级编程》的一个关于线程的例子(带上部分注释)
- JAVA 线程 开启线程 一个类里只开一个线程的简单办法
- 自制简单的Java下载器——来自《Java高级编程》的一个关于线程的例子(带上部分注释)
- 一个简单的Java对象池实现——可用来解决SimpleDateFormat的线程安全问题
- JAVA拾遗 - 一个简单的4线程TCP客户端
- Java多线程-一个简单的线程,实现挂起和恢复的功能
- java中最简单的方式新起一个线程
- java中线程的简单的线程的多线程的一个区别
- 一个简单的定时通知回调线程实现
- 自制简单的Java下载器——来自《Java高级编程》的一个关于线程的例子(带上部分注释)
- JAVA 线程 开启线程 一个类里只开一个线程的简单办法
- Java多线程-一个简单的线程,实现挂起和恢复的功能
- Java线程锁一个简单Lock
- java 使用线程做的一个简单的ATM存取款实例代码
- 如何找到占用cpu最高的java线程?tomcat所在线程是守护线程吗?如何在linux中断一个Java进程中的线程,如何让一个守护线程不被结束
- Java线程(学习整理)--4---一个简单的生产者、消费者模型
- Java多线程-一个简单的线程,实现挂起和恢复的功能
- java 使用线程做一个简单的ATM存取款实例.(转)
- 用java实现的一个简单的定时报警程序
- 一个简单的java线程代码