0

で複数回呼び出される次の関数があります

report="http://myURL/some_file.php" + "?someParam=" + getSomeParam()";

wheremyURLは常に同じで、some_file.phpandsomeParamは毎回異なります。

private static void makeReport(final String report) {
    try {
        URL url = new URL(report);
        try {
            url.openStream();
        } catch (IOException e) {
            return; // do nothing
        }
    } catch (MalformedURLException e) {
        return; // do nothing
    }
}

問題は、この状況を処理する効率的な方法である場合、異なるパラメーターで新しい接続を開くたびに? また、レポートはメイン プログラムには影響しないので、別のスレッド/プロセスで実行する必要がありますか?

4

1 に答える 1

1

新しい接続を開くにはある程度のオーバーヘッドがありますが、プログラムがソケットを多用しているようには思えないため、オーバーヘッドはごくわずかです。ちなみに、2つのtryブロックは必要ありません。1つだけ持っていて、catchブロックを次々に配置することができます。

private static void makeReport(final String report) {
    InputStream in = null;
    try {
        URL url = new URL(report);
        in = url.openStream();
    } catch (MalformedURLException e) {
        return; // do nothing
    } catch (IOException e) {
        return; // do nothing
    } finally {
        try { in.close(); } catch (IOException ex) { ex.printStackTrace(); }
    }
}

このメソッドが独自のスレッドに入る必要があるかどうかについては、コンテキストによって異なります。非同期である必要がありますか?価値があるので、単純なGETリクエストを作成するのにそれほど時間はかからないはずです。独自のスレッドにする必要がある状況は想像できません。

最後の注意として、接続を開くときはいつでも、特にtry-catch-finally(またはtry-with-resources)構造では、接続を閉じることをお勧めします。この方法に従わないことは、より複雑なソケットプログラミングで接続リークを導入するための優れた方法です。

于 2012-12-30T17:00:40.340 に答える