Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > ThreadPoolExecutor |
Автор: Anime 8.10.2014, 21:41 | ||
Примерный код
Есть реализованный ThreadPoolExecutor когда произошел submit, метод beforeExecute выдает сообщение Executer`у ( LinkedBlockingDeque = data.take() ) , после выполнения метод afterExecute выдает полученные данные и передает на вторичную обработку, методу parse (т.е. парсить данные) Так вот вопрос все эти манипуляция надо делать в классе Executer (которые реализованные в методах beforeExecute и afterExecute) ? Или оставить метод beforeExecute как есть, но метод parse перенести в Executer ? |
Автор: korian 9.10.2014, 02:31 |
не очень понятно, что вообще надо. beforeExecute и afterExecute имеет смысл переопределять в том случае, если это касаеться именно ThreadPoolExecutor. Т.е. если код, который будет в beforeExecute и afterExecute необходим для "правильной" работы самого пула. а у вас там походу бизнес логика какая-то. |
Автор: Anime 9.10.2014, 10:05 | ||
Идея тут такова. Есть два массива с сообщениями: первый массив сообщений это PriorityBlockingQueue, второй это LinkedBlockingDeque. Так вот первый массив должен ждать сообщений от второго, т.е. он не выполниться пока во второй массив не придут сообщения. И так. Класс SuperPool создан на основе PriorityBlockingQueue и имеет приоритет в выполнении сообщений. При поступлении сообщения он выполняется с нормальным приоритетом и в методе beforeExecute выдается ему второе сообщение и счетчик выданного второго сообщения повышается. В методе afterExecute возвращает результат выполнения и если он не выполнился с ошибкой, сабмитится заново но с высоким приоритетом. Вот псевдо пример запуска
в данном примере он запустит 100 потоков с сообщениями hello, но из них отработают тока 20, так как в data тока 20 сообщений типа world, а все остальные 80 будут ждать прихода сообщений в data. Подправил малость первый пост... Правильно ли в методе beforeExecute реализовывать выдачу второстепенного сообщения, а в методе afterExecute после обработки второстепенного сообщения заново его выбрасывать в массив datas? Или по хорошему это надо делать в самом потоке Executer? Или в каких то отдельных потоках реализовывать?... надеюсь объяснил как-то-) |