あなたは間違いなくウェブクローラーとの並行性を望んでいるでしょう:)
また、スレッドを再利用でき、タスクごとに新しいスレッドをインスタンス化するコストをかからないように、スレッドプールを設定することをお勧めします。
使用しているスレッドプールオプションは、FixedThreadPoolとCachedThreadPoolです。これらのそれぞれの利点については、Java同時実行チュートリアルで詳しく説明されています。CachedThreadPoolの大きな欠点は、作成できるスレッドの数に制限がないことです。非常に多くのスレッドがプールに追加された場合、パフォーマンスの大幅な低下またはタイムアウトが発生する可能性があります(ソケットタイムアウトが定義されている場合)。
いずれの場合も、スレッドプールを設定するためのベストプラクティスは、java.util.concurrent.Executorsを使用することです。
次のいずれかを呼び出してExecutorServiceを作成するだけです。
ExecutorService threadPool = Executors.newCachedThreadPool();
ExecutorService threadPool = Executors.newFixedThreadPool(500);
スレッドプールを取得したら、submit()メソッドを使用して、単一のランナブル(応答を返さない)または呼び出し可能(応答を返す)のいずれかを呼び出すことができます。
先物を生成するために呼び出し可能オブジェクトを使用している場合は、.invokeAll()を実行することもできます。
futures = cachedThreadPool.invokeAll(tasks,
timeout,
TimeUnit.MILLISECONDS);
そして、結果を取得します。
for (Future f: futures) {
someList.add(f.get())
}
複数のスレッドが同じオブジェクトを変更できるようにする場合は、セッターでsynchronizedキーワードを使用するか、スレッドセーフなデータ型を使用する必要があります。
お役に立てれば。幸運を!!