Java-Executor Framework - PullRequest
       9

Java-Executor Framework

0 голосов
/ 14 марта 2011

Пожалуйста, посмотрите на мой следующий код ....

  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 потоками. Мне нужна ваша помощь, чтобы узнать, как получить контроль над потоками. Если какой-либо поток завершил свою задачу, он должен обработать немедленную доступную задачу из набора результатов. Можно ли добиться с помощью Executor Framework.

Спасибо ...

vijay365

Ответы [ 4 ]

2 голосов
/ 14 марта 2011

Код, который вы уже опубликовали, делает это. Ваш код не будет сразу порождать 100 потоков. Он создаст 10 потоков, которые потребляют задачи из очереди, содержащей ваши Runnables.

Из Executors.newFixedThreadPool Javadocs :

Создает пул потоков, который повторно использует фиксированный набор потоков, работающих от общая неограниченная очередь.

Вместо использования статического числа потоков (в данном случае 10) вы должны определить число динамически:

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

Кроме того, я не понимаю, почему вы звоните Thread.sleep?

1 голос
/ 14 марта 2011

ResultSet, вероятно, является результатом запроса JDBC.

Эта конструкция почти наверняка обречена на провал.

Реализации интерфейса JDBC не являются поточно-ориентированными.

ResultSet - это запуганные ресурсы, которые должны быть закрыты в той же области, в которой они были созданы. Если вы раздаете их, вы напрашиваетесь на неприятности.

Многопоточный код трудно писать хорошо, и даже сложнее отлаживать, если он неправильный.

Вы почти наверняка движетесь в неправильном направлении с этим дизайном. Я бы поставил большую сумму денег, что вы виновны в преждевременной оптимизации. Вы надеетесь, что несколько потоков сделают ваш код быстрее, но то, что произойдет, - это нарезка десяти потоков времени на одном процессоре с одинаковым или более длительным временем. (Переключение контекста тоже требует времени.)

Немного лучшей идеей было бы загрузить ResultSet в объект или коллекцию, закрыть ResultSet, а затем выполнить некоторую многопоточную обработку этого возвращаемого объекта.

0 голосов
/ 14 марта 2011

Мелв прав, проверьте эту страницу, у нее есть несколько простых примеров http://www.vogella.de/articles/JavaConcurrency/article.html

0 голосов
/ 14 марта 2011

Попробуйте executor.submit(worker);

...