2

Webクローラーを作成しましたが、シングルスレッドです。現在、複数のスレッドで動作するように拡張しています。私は以下を理解することができません:

  1. いくつのスレッドを作成する必要がありますか?URIを保持するキューの長さに応じて変化する固定数または動的数のどちらにする必要がありますか?(使用可能なメモリも考慮に入れて)
  2. Runnable Interfaceを介してスレッドの新しいクラスを作成しました。各スレッドのrunメソッドが、を呼び出しているMainクラスで作成したオブジェクトにアクセスできるようにしますthread.start()。各スレッドからこのオブジェクトにアクセスするにはどうすればよいですか?

NetBeansを使用しています。

4

3 に答える 3

4

最初の質問については、あなたの状況では、次のように動的に調整するスレッドプールを使用するのが最善だと思います。

ExecutorService exec = Executors.newCachedThreadPool();

必要に応じて新しいスレッドを作成するスレッドプールを作成しますが、以前に作成されたスレッドが利用可能になったときに再利用します。これらのプールは通常、多くの短期間の非同期タスクを実行するプログラムのパフォーマンスを向上させます。実行するための呼び出しは、利用可能な場合、以前に構築されたスレッドを再利用します。使用可能な既存のスレッドがない場合は、新しいスレッドが作成され、プールに追加されます。60秒間使用されなかったスレッドは終了し、キャッシュから削除されます。したがって、十分長い間アイドル状態のままであるプールは、リソースを消費しません。

2番目の質問では、コンストラクターを作成し、その方法でオブジェクトを渡すことができます。

class ThreadTask implements Runnable {
     private Object obj;

     public ThreadTask(Object obj) {
         this.obj = obj;
     }

     public void run() {
     }
}

public static void main(String[] args) {
     Object obj = new Object();
     exec.submit(new ThreadTask(obj));
}
于 2012-10-04T07:28:42.337 に答える
3

あなたは間違いなくウェブクローラーとの並行性を望んでいるでしょう:)

また、スレッドを再利用でき、タスクごとに新しいスレッドをインスタンス化するコストをかからないように、スレッドプールを設定することをお勧めします。

使用しているスレッドプールオプションは、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キーワードを使用するか、スレッドセーフなデータ型を使用する必要があります。

お役に立てれば。幸運を!!

于 2012-10-04T07:40:52.140 に答える
1

具体的な答えはありませんでした。しかし、あなたは以下について学ぶことができます-

の最初のポイントの研究のためにExecutorService and ThreadPoolExecutor

の2番目のポイントの研究のためにcallable and Future

于 2012-10-04T07:22:06.317 に答える