1

次のコード(アウトライン)を使用しています:

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 を返しています - タイムアウトによってキャンセルされません:(

どんな助けでも大歓迎です。前もって感謝します。

4

1 に答える 1