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();

      }

      }

     }

在这部分中,如果结果集(rs)有 100 个记录执行器创建 100 个线程.....我需要在 10 个线程中运行这个过程。我需要您的帮助来了解如何控制线程。如果任何线程已完成其任务,那么它应该处理结果集中的即时可用任务。是否可以使用执行器框架来实现。

谢谢...

维杰365

4

3 回答 3

2

您已经发布的代码就是这样做的。您的代码不会立即产生 100 个线程。它将产生 10 个线程,这些线程从包含您的 Runnables 的队列中消耗任务。

Executors.newFixedThreadPool Javadocs

创建一个线程池,该线程池重用一组固定的线程,这些线程在共享无界队列中运行。

您应该动态确定线程数,而不是使用静态线程数(在本例中为 10):

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

另外,我不明白你为什么打电话Thread.sleep

于 2011-03-14T04:27:07.667 回答
1

ResultSet 可能是一个 JDBC 查询结果。

这种设计几乎注定要失败。

JDBC 接口实现不是线程安全的。

结果集是稀缺资源,应该在创建它们的同一范围内关闭。如果你把它们传递出去,你就是在自找麻烦。

多线程代码很难写好,如果不正确则更难调试。

几乎可以肯定,这种设计走错了方向。我敢打赌你犯了过早的优化。您希望多线程可以使您的代码更快,但是会发生十个线程在一个 CPU 上进行时间切片并花费相同或更长的时间。(上下文切换也需要时间。)

稍微好一点的想法是将 ResultSet 加载到对象或集合中,关闭 ResultSet,然后对返回的对象进行一些多线程处理。

于 2011-03-14T04:30:05.713 回答
0

尝试executor.submit(worker);

于 2011-03-14T04:33:50.157 回答