通常服务器会有守候线程来监听用户的连接,通常这类应用由Socket实现,这类应用必须考虑两个问题:
1. 避免线程阻塞,保证接收的数据尽快处理
2.稳定性和可靠性问题
一旦应用的守候线程出现异常就会导致程序处理出现问题, 下面我们通过模拟服务器Socket异常,来捕获线程异常,然后重启守护线程。
public class TcpServer implements Runnable {
public TcpServer() {
//创建一个线程
Thread thread = new Thread(this);
//为线程指定异常处理器
thread.setUncaughtExceptionHandler(new TcpServerExceptionHandler());
//启动线程
thread.start();
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println("系统运行正常"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//使正在运行的线程抛出异常
throw new RuntimeException();
}
/**
* 实现线程捕捉器的接口
* @author Administrator
*
*/
private static class TcpServerExceptionHandler implements Thread.UncaughtExceptionHandler{
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("线程"+t.getName()+"出现异常,自行重启,请分析原因");
e.printStackTrace();
new TcpServer();
}
}
public static void main(String[] args) {
//创建并运行线程
new TcpServer();
}
}
实际的运行结果是这样的