我正在使用以下代码(大纲):
ExecutorService executor = Executors.newFixedThreadPool(20);
List<Future<statusModel>> futures = new ArrayList<Future<statusModel>>();
for (Map.Entry<String, String> url : urls.entrySet())
{
Future<statusModel> future = executor.submit(mycallable);
futures.add(future);
}
for (Map.Entry<String, String> url : urls.entrySet())
{
try
{
status = (statusModel) futures.get(i).get(50, TimeUnit.MILLISECONDS);
// do stuff with status
}
catch (InterruptedException | ExecutionException | TimeoutException e)
{
System.out.println("Error<checkServers>: Timeout OR "+e.getMessage());
}
}
executor.shutdownNow();
System.out.println("Shutdown: "+executor.isShutdown());
我的控制台说:关机:真
我的可调用:
public statusModel call() throws Exception
{
InputStream in = null;
BufferedReader br = null;
statusModel status = new statusModel();
try
{
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
status.setStatusCode(conn.getResponseCode());
status.setUrl(urlStr);
if(status.getStatusCode()/100 == 2) // Status = OK
{ // Read JSON response }
}
catch (MalformedURLException e)
{
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
if(in != null)
in.close();
if(br != null)
br.close();
}
return status;
}
有时当我一遍又一遍地运行这个块时,我会收到这个错误:
2013 年 8 月 20 日上午 9:35:44 org.apache.catalina.core.StandardWrapper 卸载信息:等待 1 个实例被释放 2013 年 8 月 20 日上午 9:35:45 org.apache.catalina.loader。 WebappClassLoader clearReferencesThreads 严重:Web 应用程序 [/Server_Status] 仍在处理尚未完成的请求。这很可能造成内存泄漏。您可以使用标准 Context 实现的 unloadDelay 属性来控制请求完成的时间。2013 年 8 月 20 日上午 9:35:45 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 严重:Web 应用程序 [/Server_Status] 似乎已经启动了一个名为 [pool-3-thread-6] 的线程,但未能停止它。这很可能造成内存泄漏。
我已经关闭了“执行程序”,也检查了同样的情况。我仍然收到此错误。我在这里做错了吗?
更新:我第一次使用 Future。如果我需要发布更多内容以更好地解释,请告诉我。
更新:我尝试打印所有 future.isDone()。由于某种原因,超过超时的期货仍然返回 isDone() = false - 没有被 timout 取消:(
任何帮助表示赞赏。提前致谢。