1

新人 Java の質問をしてもいいですか?

Web からいくつかのファイルをダウンロードしています。このメソッド download(url location) は複数回呼び出されます。

public static void download(final String url) {
    Thread t = new Thread("download") {
        @Override
        public void run() {
            try {
                synchronized (object) {
                    // download & save
                }
            } catch(Exception e) {}
        }
    };
    t.start();
}

ダウンロードが1つずつ行われるように、「同期」を追加しました。(複数のダウンロードが同時に発生することはありません)。
download() が複数回呼び出されても、同期は最初のスレッドが終了するまで他のスレッドをブロックすると推測しています。

上記のコードは機能しますか? またはキューを実装する必要がありますか? 1つずつデキューしますか?
同期は「十分な」スレッドをブロックできますか? (30? 50?) それとも制限がありますか?

4

3 に答える 3

1

上記のコードは機能しますか?

はい、すべてのスレッドで同じオブジェクトを参照する限りobject、同期ブロック内のコードは一度に 1 つのスレッドによってのみ実行されます。

[...] またはキューを実装する必要がありますか? 1つずつデキューしますか?

一般的に言えば、可能な限り高レベルの構造を使用することをお勧めします (たとえば、java.util.concurrent パッケージから)。たとえば、これらの種類のものにはエグゼキュータ サービスを使用することを検討できます。

[...] 同期は「十分な」スレッドをブロックできますか? (30? 50?) それとも制限がありますか?

いいえ、制限はありません。少なくとも 30 または 50 には近くありません :-)

于 2012-07-23T20:04:46.810 に答える
0

追加のスレッドの作成を避けることができる場合は、通常、そうする必要があります。私が理解しているように、2 つの作業項目 (ダウンロード) を並行して行う必要はありません。そのため、パフォーマンスの点で最善の方法は、単一のワーカー スレッドによってポーリングされる同時キューの実装を使用することです。

于 2012-07-23T20:24:57.200 に答える