0

私の次のコードを見てください....

  private static final int NTHREDS = 10;
  ExecutorService executor = Executors.newFixedThreadPool(NTHREDS);
  while(rs.next()){
            webLink=rs.getString(1);
            FirstName=rs.getString(2);
            MiddleName=rs.getString(3);
            Runnable worker = new MyRunnable(webLink,FirstName,MiddleName);// this interface has run method....
            executor.execute(worker); 

   }

//追加した

      public class MyRunnable implements Runnable  {


      MyRunnable(String webLink,String FirstName,String MiddleName){
         ** Assigning Values...***
      }

      @Override

      public void run() {

      long sum = 0;

      **Calling method to crawl by passing those Values**

      try {

      Thread.sleep(200);

      } 

      catch (InterruptedException e)

      {

      e.printStackTrace();

      }

      }

     }

この部分で、100 レコードのエグゼキューターを持つ結果セット ( rs ) が 100 スレッドを作成している場合..... このプロセスを 10 スレッドで実行する必要があります。スレッドの制御を取得する方法を知るためにあなたの助けが必要です.. いずれかのスレッドがそのタスクを完了した場合、そのスレッドは結果セットからすぐに利用可能なタスクを処理する必要があります. エグゼキューターフレームワークを使用して達成することは可能ですか?

ありがとう...

vijay365

4

3 に答える 3

2

すでに投稿したコードはこれを行います。あなたのコードはすぐに 100 個のスレッドを生成しません。Runnables を含むキューからタスクを消費する 10 個のスレッドを生成します。

Executors.newFixedThreadPool Javadocsから:

無制限の共有キューで動作するスレッドの固定セットを再利用するスレッド プールを作成します。

静的なスレッド数 (この場合は 10) を使用する代わりに、動的に数を決定する必要があります。

    final int NTHREADS = Runtime.getRuntime().availableProcessors();

また、なぜあなたが電話しているのかわかりませんThread.sleepか?

于 2011-03-14T04:27:07.667 に答える
1

ResultSet はおそらく JDBC クエリの結果です。

この設計はほぼ確実に失敗する運命にあります。

JDBC インターフェースの実装はスレッドセーフではありません。

ResultSet は、それらが作成されたのと同じスコープで閉じる必要がある恐怖のリソースです。それらを渡すと、トラブルを求めています。

マルチスレッド コードは、適切に記述するのが難しく、正しくないとデバッグするのがさらに難しくなります。

この設計では、ほぼ確実に間違った方向に向かっています。あなたが時期尚早の最適化の罪を犯していることに、多額のお金を賭けるでしょう。複数のスレッドがコードを高速化することを望んでいますが、1 つの CPU で 10 スレッドのタイム スライスを実行すると、同じかそれ以上の時間がかかります。(コンテキストの切り替えにも時間がかかります。)

ResultSet をオブジェクトまたはコレクションにロードし、ResultSet を閉じてから、返されたオブジェクトに対してマルチスレッド処理を実行することをお勧めします。

于 2011-03-14T04:30:05.713 に答える
0

試すexecutor.submit(worker);

于 2011-03-14T04:33:50.157 に答える