首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有超时(Future.get)的底层线程行为

具有超时(Future.get)的底层线程行为
EN

Stack Overflow用户
提问于 2013-01-15 14:21:02
回答 1查看 1.8K关注 0票数 1

我们正在使用带超时的Future来完成任务。当超过时间限制时,我们会得到一个TimeOutException。从thread dump的行为中,我意识到底层线程仍在继续。

是这样吗?它如何处理漫游的多个线程?如果从池中删除的线程没有抛出IOException怎么办?

如果这是真的,什么是kill底层线程的方法。在我的例子中,它一直在等待一个外部IO

线程转储的一部分:

代码语言:javascript
运行
复制
Thread 29587: (state = IN_NATIVE)
 - java.net.SocketInputStream.socketRead0(java.io.FileDescriptor, byte[], int, int, int) @bci=0 (Compiled frame; information may be imprecise)
 - java.net.SocketInputStream.read(byte[], int, int) @bci=84, line=129 (Compiled frame)
 - java.io.BufferedInputStream.fill() @bci=175, line=218 (Compiled frame)
 - java.io.BufferedInputStream.read1(byte[], int, int) @bci=44, line=258 (Compiled frame)
 - java.io.BufferedInputStream.read(byte[], int, int) @bci=49, line=317 (Compiled frame)
 - sun.net.www.MeteredStream.read(byte[], int, int) @bci=16, line=116 (Compiled frame)
 - java.io.FilterInputStream.read(byte[], int, int) @bci=7, line=116 (Compiled frame)
 - sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(byte[], int, int) @bci=4, line=2672 (Compiled frame)
 - javax.imageio.stream.FileCacheImageInputStream.readUntil(long) @bci=64, line=121 (Compiled frame)
 - javax.imageio.stream.FileCacheImageInputStream.read(byte[], int, int) @bci=69, line=167 (Compiled frame)
 - com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(long, boolean, boolean) @bci=0 (Compiled frame)
 - com.sun.imageio.plugins.jpeg.JPEGImageReader.readNativeHeader(boolean) @bci=12, line=532 (Compiled frame)
 - com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly() @bci=92, line=277 (Compiled frame)
 - com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(int) @bci=41, line=409 (Compiled frame)
 - com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(int, boolean) @bci=2, line=525 (Compiled frame)
 - com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(int, javax.imageio.ImageReadParam, boolean) @bci=3, line=968 (Compiled frame)
 - com.sun.imageio.plugins.jpeg.JPEGImageReader.read(int, javax.imageio.ImageReadParam) @bci=8, line=948 (Compiled frame)
 - javax.imageio.ImageIO.read(javax.imageio.stream.ImageInputStream) @bci=55, line=1422 (Compiled frame)
 - javax.imageio.ImageIO.read(java.net.URL) @bci=42, line=1374 (Compiled frame)

一旦TimeOutException发生(对于循环中的任何任务),我们就取消任务,如下所示:

代码语言:javascript
运行
复制
for(Entry<Requests, Future<?>> futureTask : futureTasks.entrySet())
                {
                    Future<?> future = futureTask.getValue();
                    if(!future.isDone() || future.isCancelled())
                    {
                        future.cancel(true);
                        }
                }

难道它不应该解决问题吗?

敬请指教。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-15 14:35:09

是的,在这种情况下,你的线程继续运行,而执行的任务不受影响。TimeoutException表示您没有在适当的时间得到结果。

如果你想中断底层线程,你可以处理异常,并使用Future的used实现中的cancel(true)方法。

编辑

正如堆栈跟踪所解释的,我忽略了线程正在等待阻塞I/O的情况。在这种情况下,从future.cancel(true)调用的Thread.interrupt()不会有什么帮助。

这种情况下的常见模式是关闭底层输入流。我对javax.imageio包不是很熟悉,但是在ImageIO上有一个重载的方法,它接受InputStream。您可能希望将其存储在某个位置,然后在超时时将其关闭。

它将在SocketInputStream上调用close(),而close()又将调用正在等待阻塞读取完成的底层套接字的close()方法。在此套接字上的I/O操作(根据您的跟踪)中被阻塞的正在执行的线程将停止等待带有SocketException的EOF。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14332153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档