当前位置: 首页 > 知识库问答 >
问题:

如何处理不可中断的阻塞(ExecutorService)

程鸿波
2023-03-14

我想使用ExecutorService框架解决一些DNS任务。我使用java API进行DNS查询:1/java.net.InetSocketAddress.InetSocketAddress(String,int)-名称查找2/java.net.InetAddress.getByName(String)-名称查找3/java.net.InetAddress.getHostName()-反向名称查找

典型的DNS任务是可调用的对象,定义如下:

public class IpAddressResolver extends DnsCallable<String, InetAddress> {

    public IpAddressResolver(String host) {
        super(host);
    }

    public InetAddress call() throws Exception {
        return InetAddress.getByName(target);
    }

}

如你所见,这3个电话都是不可中断的。问题是,如果Future.get(long, TimeUnit)超时,然后我调用Future.cancel(boolean)我没有任何机会阻止工作线程尝试解决DNS任务(我测试了超时:30尝试:5在Linuxresolv.conf文件,以模拟长时间运行的DNS查询)。

这样做的结果是,如果当前正在运行的工作线程不能停止,当我提交另一个DNS任务时,就必须创建第二个线程,对于第三个任务,我将有第三个线程,依此类推。如果DNS服务器没有响应,那么我将在池中有一堆工作线程什么都不做(即等待超时*尝试=150秒后的负面DNS响应)。

我担心,如果创建了许多线程并且在线程池中处于活动状态(顺便说一句,我使用缓存线程池),我将不得不处理另一类问题。。。

我知道一个不可中断的阻塞套接字读取调用可以通过关闭底层套接字来停止,但我这边的情况并非如此。

有人知道如何处理这类问题吗?

共有1个答案

吕修筠
2023-03-14

DNS查找调用由系统调用完成。因此,java不能中断它。唯一的方法是创建一个线程池,并希望错误的请求不会经常溢出线程池。或者只需通过适当的超时调整您的resolv.conf。在Java中你什么都做不了。

作为替代,您可以寻找一个纯java dns客户端实现,它很可能是可中断的。快速google显示:http://sourceforge.net/p/dnsjava/

 类似资料:
  • 如另一个问题中所述,当使用Undertow时,所有处理都应该在专用的工作线程池中完成,如下所示: 我知道可用于显式地告诉Undertow在专用的线程池中调度请求以阻止请求。我们可以通过将包装在实例中来修改上面的示例,如下所示: 调用此方法将exchange置于阻塞模式,并创建一个BlockingHttpExchange对象来存储流。当交换处于阻塞模式时,输入流方法变得可用,除了阻塞和非阻塞模式之间

  • 问题内容: 我有一个类,它从中获取对象并通过连续循环调用来处理它们。在某些时候,我知道不会再有其他对象添加到队列中。如何中断该方法以使其停止阻塞? 这是处理对象的类: 这是使用此类处理对象的方法: 问题答案: 如果不能选择中断线程,则另一种方法是将“标记”或“命令”对象放在MyObjHandler可以识别的队列上,并退出循环。

  • 阻塞信号是保持该信号并推迟发送,直到阻塞解除,但不会丢失。 结构体sigset_t(信号集合) 其中每一位对应系统支持的一种信号。结构体内部是数组。 函数 函数名 描述 [[sigemptyset sigempty]] 初始化信号集为空集 [[sigfillset sigfillset]] 初始化信号集包含全部信号 [[sigaddset sigaddset]] 向信号集中添加信号 [[sigde

  • 我正在编写一个有3个线程的程序。一个读取一个文本文件并将单词输入到大小为2的ArraylistBlockingQueue中。下一个获取该列表并反转其中的每个其他单词。最后一个线程获取单词并将它们写入一个新的文本文件。 我所有的东西都在工作,除了我不知道如何中断和停止我的线程。程序写入文本文件,但从未结束。 主要方法 输入 反向类@重写公共void run(){ 输出代码@覆盖公共无效run(){

  • 我刚从Vert开始。并且想了解在处理REST HttpRequest时,处理潜在长(阻塞)操作的正确方法是什么。该应用程序本身就是一个Spring应用程序。 到目前为止,我有一个简化的REST服务: Spring配置: 现在的问题是:如何正确处理(阻止)调用我的postgresService,这可能需要更长的时间,如果有很多项目得到/返回? 在研究和查看一些示例后,我看到了一些方法,但我不完全理解

  • 问题内容: OpenSSL库允许使用SSL_read从基础套接字读取并使用SSL_write对其进行写入。这些函数可能会根据其SSL协议需求(例如,在重新协商连接时),以SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE返回。 我不太了解API希望我如何处理这些结果。 对一个接受客户端连接的服务器应用程序进行映像,建立一个新的ssl会话,使基础套接字成为非阻塞状态,然