次のコード(アウトライン)を使用しています:
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());
私のコンソールは言う: シャットダウン: true
myCallable:
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 AM org.apache.catalina.core.StandardWrapper アンロード情報: 1 つのインスタンスの割り当てが解除されるのを待っています 2013 年 8 月 20 日 9:35:45 AM org.apache.catalina.loader. WebappClassLoader clearReferencesThreads SEVERE: Web アプリケーション [/Server_Status] はまだ完了していない要求を処理しています。これにより、メモリ リークが発生する可能性が非常に高くなります。標準の Context 実装の unloadDelay 属性を使用して、リクエストが終了するまでの許容時間を制御できます。2013 年 8 月 20 日 9:35:45 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads SEVERE: Web アプリケーション [/Server_Status] は [pool-3-thread-6] という名前のスレッドを開始したようですが、停止に失敗しましたそれ。これにより、メモリ リークが発生する可能性が非常に高くなります。
「executor」も同じことを確認してシャットダウンしました。それでもこのエラーが発生します。ここで何か間違ったことをしていますか?
更新: Future を初めて使用しています。よりよく説明するためにさらに投稿する必要がある場合は、お知らせください。
更新: すべての future.isDone() を印刷してみました。何らかの理由で、タイムアウトを超えた先物はまだ isDone() = false を返しています - タイムアウトによってキャンセルされません:(
どんな助けでも大歓迎です。前もって感謝します。