通过线程巧为InetAddress.getByName() DNS查询添加超时限制功能

本文介绍了一种通过自定义线程类来解决Java DNS查询超时问题的方法,该方法通过创建一个子线程并使用join()函数限制主线程等待DNS响应的时间,从而避免长时间阻塞。
部署运行你感兴趣的模型镜像

虽然Socket类有setTimeout()方法,URLConnection有setConnectTimeout()方法,但这都不能给DNS查询过程添加时间限制,也就是说,如果DNS服务器挂了,那么代码就会阻塞几十秒才能抛出异常。我最近就遇到了这个问题,当DNS服务器出问题的时候,setTimeout()设置的超时时间就不起作用了。


经过google,发现Java目前居然还没有现成的API来处理DNS查询超时的问题。不过一个老外的博客上给出了一种曲线救国的方法:

public class DNSLookupThread extends Thread {
	private InetAddress addr;
	private String hostname;
	
	public DNSLookupThread(String hostname) {
		this.hostname = hostname;
	}
	
	public void run() {
		try {
			InetAddress add = InetAddress.getByName(hostname);
			set(add);
		} catch (UnknownHostException e) {
		}
	}
	
	private synchronized void set(InetAddress addr) {
		this.addr = addr;
	}
	
	public synchronized String getIP() {
		if (null != this.addr) {
			return addr.getHostAddress();
		}
		
		return null;
	}
}

类的使用方法如下:

DNSQuery dnsTh = new DNSQuery();
		dnsTh.start();
		dnsTh.join(2000);
		
		System.out.println(dnsTh.get()

您可能感兴趣的与本文相关的镜像

EmotiVoice

EmotiVoice

AI应用

EmotiVoice是由网易有道AI算法团队开源的一块国产TTS语音合成引擎,支持中英文双语,包含2000多种不同的音色,以及特色的情感合成功能,支持合成包含快乐、兴奋、悲伤、愤怒等广泛情感的语音。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值