Java 一个简单的线程定时 (守护线程)

时间:2022-01-07 07:28:53

守护线程也叫精灵线程: 当程序只剩下守护线程的时候 ,程序就会退出。

守护线程的作用类似在后台静默执行,比如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);
}
}

未使用守护线程前运行结果:
Java 一个简单的线程定时 (守护线程)
运行时间20s

使用后运行结果:
抛出自定义异常
Java 一个简单的线程定时 (守护线程)