Java ThreadPoolExecutor - достучаться до working threads
-
- Уже с Приветом
- Posts: 13684
- Joined: 16 Jan 2001 10:01
-
- Уже с Приветом
- Posts: 988
- Joined: 05 Mar 2001 10:01
- Location: ушел
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Java ThreadPoolExecutor - достучаться до working threads
Так топикстартер категорически отказывается хранить ссылки на Runnable в коллекцииPicasso wrote:Это не подойдет?
http://code.google.com/p/guava-librarie ... eExplained
При этом хочет иметь доступ к списку runnable.
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Java ThreadPoolExecutor - достучаться до working threads
Ну вы же небось сами документацию посмотрели и увидели, что этот класс не экспозает никакие методы для получения списка потоков. О каком хотении тогда может идти речь? Если вам лень написать 20 строчек когда, чтобы самому это имплементировать через коллекцию, ну ищите тогда в интернете, может кто-то это уже сделал за вас.Montchik wrote:Без разницы как это сделано внутри executora. Мне бы доступ к active worker threadам получить. Reflection не подходит.Интеррапт wrote:Никак, кроме как через reflections. И не надо добираться - потому что сегодня это коллекция, завтра они в следующей версии Java решат сделать это массивом, а потом, на какой-то хитрой OS, вообще не будут хранить коллекцию, например, потому что у этой OS уже есть родной API для thread pool.Montchik wrote:Да все правильно, можно конечно и эхтендить ThreadPoolExecutor или научить воркера удалять самого себя из списка. Но ведь блин ThreadPoolExecutor уже хранит этих воркеров в внутренней collection. Вот мне гондурас и не дает покоя по этому поводу. В смысле как до этой collection добраться.Интеррапт wrote:А почему геморройно чистить коллекцию ссылок? Наследовали класс ThreadPoolExecutor, там же можете добавить коллекцию ссылок на Runnable. Овверайднули там afterExecute метод и удалили из коллекции переданную вам ссылку на Runnable. Аналогично в beforeExecute можете добавлять Runnable в эту коллекцию. Или я не совсем понял вашу проблему?Montchik wrote:Опять возникла необходимость добраться до threads, скормленных в ThreadPoolExecutor для исполнения. Единственная известная мне возможность это держать на стороне collection ссылок на эти threads. Но это означает, что надо как-то чистить эту collection, чтобы избавлятья от ссылок на terminated threads, что довольно геморройно. Может кто знает, как получить доступ к working threads в самом Executore?
-
- Уже с Приветом
- Posts: 2119
- Joined: 27 Dec 1999 10:01
- Location: Воронеж -> Naperville, IL
Re: Java ThreadPoolExecutor - достучаться до working threads
Ага, в смысле нет, не подходит. См выше.Picasso wrote:Это не подойдет?
http://code.google.com/p/guava-librarie ... eExplained
-
- Уже с Приветом
- Posts: 2119
- Joined: 27 Dec 1999 10:01
- Location: Воронеж -> Naperville, IL
Re: Java ThreadPoolExecutor - достучаться до working threads
Я конечно же читал доку, но думал, может упустил чего. Поэтому здесь и спросил.Интеррапт wrote:Ну вы же небось сами документацию посмотрели и увидели, что этот класс не экспозает никакие методы для получения списка потоков. О каком хотении тогда может идти речь? Если вам лень написать 20 строчек когда, чтобы самому это имплементировать через коллекцию, ну ищите тогда в интернете, может кто-то это уже сделал за вас.Montchik wrote:Без разницы как это сделано внутри executora. Мне бы доступ к active worker threadам получить. Reflection не подходит.Интеррапт wrote:Никак, кроме как через reflections. И не надо добираться - потому что сегодня это коллекция, завтра они в следующей версии Java решат сделать это массивом, а потом, на какой-то хитрой OS, вообще не будут хранить коллекцию, например, потому что у этой OS уже есть родной API для thread pool.Montchik wrote:Да все правильно, можно конечно и эхтендить ThreadPoolExecutor или научить воркера удалять самого себя из списка. Но ведь блин ThreadPoolExecutor уже хранит этих воркеров в внутренней collection. Вот мне гондурас и не дает покоя по этому поводу. В смысле как до этой collection добраться.Интеррапт wrote: А почему геморройно чистить коллекцию ссылок? Наследовали класс ThreadPoolExecutor, там же можете добавить коллекцию ссылок на Runnable. Овверайднули там afterExecute метод и удалили из коллекции переданную вам ссылку на Runnable. Аналогично в beforeExecute можете добавлять Runnable в эту коллекцию. Или я не совсем понял вашу проблему?
-
- Уже с Приветом
- Posts: 988
- Joined: 05 Mar 2001 10:01
- Location: ушел
Re: Java ThreadPoolExecutor - достучаться до working threads
Ну как запасной вариант. Коли за внутреннюю коллекцию лупят инкапсуляцией по пальцам, так завести внешнюю. А ListenableFuture поручить чтоб оно назад коллбеками сообщало - "командир, меня тут убили - обновите список части".Montchik wrote:Ага, в смысле нет, не подходит. См выше.Picasso wrote:Это не подойдет?
http://code.google.com/p/guava-librarie ... eExplained
-
- Уже с Приветом
- Posts: 2119
- Joined: 27 Dec 1999 10:01
- Location: Воронеж -> Naperville, IL
Re: Java ThreadPoolExecutor - достучаться до working threads
Хех, дык я где-то так и делаю. Только ручками, без пользования всякого там гуана. Интересная идея была заекстендить ThreadPoolExecutor и перекрыть executeBefore and executeAfter методы. Наверное так и попробую в следующий раз.
-
- Уже с Приветом
- Posts: 988
- Joined: 05 Mar 2001 10:01
- Location: ушел
Re: Java ThreadPoolExecutor - достучаться до working threads
Я блин забыл что ты ж фреймворки не любишь. А за гуано - ответишь. =) Перед котом в наушниках какминимум.
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Java ThreadPoolExecutor - достучаться до working threads
Montchik wrote: Я конечно же читал доку, но думал, может упустил чего. Поэтому здесь и спросил.
Еще как вариант, это создавать ThreadPoolExecutor напрямую через конструктор. Тогда там в конструктор можно указать BlockingQueue<Runnable> как параметр. И собственно в этот BlockingQueue будут автоматически добавляться и удаляться Runnable обьекты.
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Java ThreadPoolExecutor - достучаться до working threads
Не факт что в этой queue будут активные таски. В доке так и написано, что юзать только длйха дебага и мониторинга, никаких гарантий нету.Интеррапт wrote:Montchik wrote: Я конечно же читал доку, но думал, может упустил чего. Поэтому здесь и спросил.
Еще как вариант, это создавать ThreadPoolExecutor напрямую через конструктор. Тогда там в конструктор можно указать BlockingQueue<Runnable> как параметр. И собственно в этот BlockingQueue будут автоматически добавляться и удаляться Runnable обьекты.
In vino Veritas!
-
- Уже с Приветом
- Posts: 2119
- Joined: 27 Dec 1999 10:01
- Location: Воронеж -> Naperville, IL
Re: Java ThreadPoolExecutor - достучаться до working threads
Пробовал уже. Этo waiting queue - для objects waiting for threads to become available, а не тех, что уже ранятся.
-
- Уже с Приветом
- Posts: 2119
- Joined: 27 Dec 1999 10:01
- Location: Воронеж -> Naperville, IL
Re: Java ThreadPoolExecutor - достучаться до working threads
Как вы лодку назовете...Picasso wrote:Я блин забыл что ты ж фреймворки не любишь. А за гуано - ответишь. =) Перед котом в наушниках какминимум.
-
- Уже с Приветом
- Posts: 64875
- Joined: 12 Jul 2002 16:38
- Location: г.Москва, ул. Б. Лубянка, д.2
Re: Java ThreadPoolExecutor - достучаться до working threads
а вот я думаю: как же кучу могучих сайтов слабали на PHP и RoR, не заморачиваясь тонкостями многопоточности?
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Java ThreadPoolExecutor - достучаться до working threads
Им наверное не нужно запускать в бекграунде и стопать запросы выполняющиея часами.Komissar wrote:а вот я думаю: как же кучу могучих сайтов слабали на PHP и RoR, не заморачиваясь тонкостями многопоточности?
In vino Veritas!
-
- Уже с Приветом
- Posts: 6969
- Joined: 26 Feb 2011 17:40
Re: Java ThreadPoolExecutor - достучаться до working threads
Если единственная проблема автора в том, что нужен доступ к этой коллекции, а злые дизайнеры j.u.c. не открыли ее в паблик, то в чем проблема, через reflection, setAccessible(true) и вперед. Будет работать всегда и без всякого геморроя и оверхеда за исключением двух случаев:Интеррапт wrote:Никак, кроме как через reflections. И не надо добираться - потому что сегодня это коллекция, завтра они в следующей версии Java решат сделать это массивом, а потом, на какой-то хитрой OS, вообще не будут хранить коллекцию, например, потому что у этой OS уже есть родной API для thread pool.Montchik wrote:Да все правильно, можно конечно и эхтендить ThreadPoolExecutor или научить воркера удалять самого себя из списка. Но ведь блин ThreadPoolExecutor уже хранит этих воркеров в внутренней collection. Вот мне гондурас и не дает покоя по этому поводу. В смысле как до этой collection добраться.Интеррапт wrote:А почему геморройно чистить коллекцию ссылок? Наследовали класс ThreadPoolExecutor, там же можете добавить коллекцию ссылок на Runnable. Овверайднули там afterExecute метод и удалили из коллекции переданную вам ссылку на Runnable. Аналогично в beforeExecute можете добавлять Runnable в эту коллекцию. Или я не совсем понял вашу проблему?Montchik wrote:Опять возникла необходимость добраться до threads, скормленных в ThreadPoolExecutor для исполнения. Единственная известная мне возможность это держать на стороне collection ссылок на эти threads. Но это означает, что надо как-то чистить эту collection, чтобы избавлятья от ссылок на terminated threads, что довольно геморройно. Может кто знает, как получить доступ к working threads в самом Executore?
1) прога работает в jvm с суперстрогим security manager, которые не дает дергать через reflection поля. Я в реальности такого не встречал ни разу.
2) в следующем JDK структура этого пуля изменится. Ну и черт с ним, во время апгрейда переписать за 5 минут на массив или чего там. Я считаю, юзать приватные апи такие вещей как j.u.c. вполне нормально и цивильно.
-
- Уже с Приветом
- Posts: 6969
- Joined: 26 Feb 2011 17:40
Re: Java ThreadPoolExecutor - достучаться до working threads
Ну слабать-то конечно слабали, быстро, ниши захватили, (за что им респект! писали бы сразу на яве или С++, до сих пор бы сидели на форумах, и обсуждали как настроить тред пулы, вместо того чтобы IPO уже отмечать), но потом все равно уперлись в проблемы производительности. И начали кто создавать хипхоп c кассандрой, кто переписывать куски сайта с руби на скалу, кто еще чегоKomissar wrote:а вот я думаю: как же кучу могучих сайтов слабали на PHP и RoR, не заморачиваясь тонкостями многопоточности?
-
- Уже с Приветом
- Posts: 6969
- Joined: 26 Feb 2011 17:40
Re: Java ThreadPoolExecutor - достучаться до working threads
Есть прикольная книжка от инженегров твиттера (meap so far), Big Data называется. Если не читали, советую. Там любопытные вещи пишут об этом в том числе.crypto5 wrote:Им наверное не нужно запускать в бекграунде и стопать запросы выполняющиея часами.Komissar wrote:а вот я думаю: как же кучу могучих сайтов слабали на PHP и RoR, не заморачиваясь тонкостями многопоточности?
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Java ThreadPoolExecutor - достучаться до working threads
Я книжек про бигдата прочитал уже достаточно, это как то относится к топику?Zorkus wrote:Есть прикольная книжка от инженегров твиттера (meap so far), Big Data называется. Если не читали, советую. Там любопытные вещи пишут об этом в том числе.crypto5 wrote:Им наверное не нужно запускать в бекграунде и стопать запросы выполняющиея часами.Komissar wrote:а вот я думаю: как же кучу могучих сайтов слабали на PHP и RoR, не заморачиваясь тонкостями многопоточности?
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Java ThreadPoolExecutor - достучаться до working threads
А что именно? Описание какого-нибудь асинхронного map/reduce ?Zorkus wrote:Есть прикольная книжка от инженегров твиттера (meap so far), Big Data называется. Если не читали, советую. Там любопытные вещи пишут об этом в том числе.crypto5 wrote:Им наверное не нужно запускать в бекграунде и стопать запросы выполняющиея часами.Komissar wrote:а вот я думаю: как же кучу могучих сайтов слабали на PHP и RoR, не заморачиваясь тонкостями многопоточности?
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Java ThreadPoolExecutor - достучаться до working threads
Ну вот предположим вы получили колекцию тредов executor-a, что вы дальше делать то будете? terminate-ить их? Как узнать какой именно нужно? Как узнать что он еще не принялся за обработку следующего запроса из очереди?Zorkus wrote:Если единственная проблема автора в том, что нужен доступ к этой коллекции, а злые дизайнеры j.u.c. не открыли ее в паблик, то в чем проблема, через reflection, setAccessible(true) и вперед. Будет работать всегда и без всякого геморроя и оверхеда за исключением двух случаев:Интеррапт wrote:Никак, кроме как через reflections. И не надо добираться - потому что сегодня это коллекция, завтра они в следующей версии Java решат сделать это массивом, а потом, на какой-то хитрой OS, вообще не будут хранить коллекцию, например, потому что у этой OS уже есть родной API для thread pool.Montchik wrote:Да все правильно, можно конечно и эхтендить ThreadPoolExecutor или научить воркера удалять самого себя из списка. Но ведь блин ThreadPoolExecutor уже хранит этих воркеров в внутренней collection. Вот мне гондурас и не дает покоя по этому поводу. В смысле как до этой collection добраться.Интеррапт wrote:А почему геморройно чистить коллекцию ссылок? Наследовали класс ThreadPoolExecutor, там же можете добавить коллекцию ссылок на Runnable. Овверайднули там afterExecute метод и удалили из коллекции переданную вам ссылку на Runnable. Аналогично в beforeExecute можете добавлять Runnable в эту коллекцию. Или я не совсем понял вашу проблему?Montchik wrote:Опять возникла необходимость добраться до threads, скормленных в ThreadPoolExecutor для исполнения. Единственная известная мне возможность это держать на стороне collection ссылок на эти threads. Но это означает, что надо как-то чистить эту collection, чтобы избавлятья от ссылок на terminated threads, что довольно геморройно. Может кто знает, как получить доступ к working threads в самом Executore?
1) прога работает в jvm с суперстрогим security manager, которые не дает дергать через reflection поля. Я в реальности такого не встречал ни разу.
2) в следующем JDK структура этого пуля изменится. Ну и черт с ним, во время апгрейда переписать за 5 минут на массив или чего там. Я считаю, юзать приватные апи такие вещей как j.u.c. вполне нормально и цивильно.
In vino Veritas!
-
- Уже с Приветом
- Posts: 6969
- Joined: 26 Feb 2011 17:40
Re: Java ThreadPoolExecutor - достучаться до working threads
Не, MR/hadoop это все и без них давно описано и реализовано. Там скажу сразу, авторов кое-где заносит и они обобщают свой опыт из твиттера на все large scale projects, и во вторых, они в процессе написания еще, и реагируя на наезды коструктивные комменты на форуме свою книгу правят.Интеррапт wrote:А что именно? Описание какого-нибудь асинхронного map/reduce ?Zorkus wrote:Есть прикольная книжка от инженегров твиттера (meap so far), Big Data называется. Если не читали, советую. Там любопытные вещи пишут об этом в том числе.crypto5 wrote:Им наверное не нужно запускать в бекграунде и стопать запросы выполняющиея часами.Komissar wrote:а вот я думаю: как же кучу могучих сайтов слабали на PHP и RoR, не заморачиваясь тонкостями многопоточности?
- там интересные есть концепции create-read systems, т.е. где операций изменения и удаления вообще нет, и даются объяснения, каким образом это упрощает построение мастшабируемых систем в смысле CAP theorem (ну там они еще рассказывают про упрощение conflict resolution при восстановалении связи между партишенами и прочим), есть интересное общее описание трехуровневой системы для таких проектов и прочее.
- описываются еще несколько фреймворков типа Thrift для сериализации и перегонки данных.
В общем, я читаю по мере того как они публикают новые главы и им пишу комментарии вот тут: http://www.manning-sandbox.com/forum.js ... 7&start=30
-
- Уже с Приветом
- Posts: 6969
- Joined: 26 Feb 2011 17:40
Re: Java ThreadPoolExecutor - достучаться до working threads
Я откуда знаю, я же написал выделено жирным Вообще конечно убивать треды в тред пуле в обход интерфейса этого самого тред пула это ад. Я бы хранил объекты future/callable или как их там, и канселил по мере необходимости.crypto5 wrote:Ну вот предположим вы получили колекцию тредов executor-a, что вы дальше делать то будете? terminate-ить их? Как узнать какой именно нужно? Как узнать что он еще не принялся за обработку следующего запроса из очереди?Zorkus wrote:Если единственная проблема автора в том, что нужен доступ к этой коллекции, а злые дизайнеры j.u.c. не открыли ее в паблик, то в чем проблема, через reflection, setAccessible(true) и вперед. Будет работать всегда и без всякого геморроя и оверхеда за исключением двух случаев:Интеррапт wrote:Никак, кроме как через reflections. И не надо добираться - потому что сегодня это коллекция, завтра они в следующей версии Java решат сделать это массивом, а потом, на какой-то хитрой OS, вообще не будут хранить коллекцию, например, потому что у этой OS уже есть родной API для thread pool.Montchik wrote:Да все правильно, можно конечно и эхтендить ThreadPoolExecutor или научить воркера удалять самого себя из списка. Но ведь блин ThreadPoolExecutor уже хранит этих воркеров в внутренней collection. Вот мне гондурас и не дает покоя по этому поводу. В смысле как до этой collection добраться.Интеррапт wrote: А почему геморройно чистить коллекцию ссылок? Наследовали класс ThreadPoolExecutor, там же можете добавить коллекцию ссылок на Runnable. Овверайднули там afterExecute метод и удалили из коллекции переданную вам ссылку на Runnable. Аналогично в beforeExecute можете добавлять Runnable в эту коллекцию. Или я не совсем понял вашу проблему?
1) прога работает в jvm с суперстрогим security manager, которые не дает дергать через reflection поля. Я в реальности такого не встречал ни разу.
2) в следующем JDK структура этого пуля изменится. Ну и черт с ним, во время апгрейда переписать за 5 минут на массив или чего там. Я считаю, юзать приватные апи такие вещей как j.u.c. вполне нормально и цивильно.
-
- Уже с Приветом
- Posts: 64875
- Joined: 12 Jul 2002 16:38
- Location: г.Москва, ул. Б. Лубянка, д.2
Re: Java ThreadPoolExecutor - достучаться до working threads
и какие реальные примеры?Zorkus wrote:Есть прикольная книжка от инженегров твиттера (meap so far), Big Data называется. Если не читали, советую. Там любопытные вещи пишут об этом в том числе.crypto5 wrote:Им наверное не нужно запускать в бекграунде и стопать запросы выполняющиея часами.Komissar wrote:а вот я думаю: как же кучу могучих сайтов слабали на PHP и RoR, не заморачиваясь тонкостями многопоточности?
все, что я слышал - от индусов
1. был хороший сайт на ПХП
2. привлек тысячи и тысячи юзеров
3. в какой-то момент стал тормозить, и начальство наняло Великий Индусский Консалтинг (ВИК)
4. ВИК все тщательно проанализировал и рекомендовал все переписать на Джаву с начала и до забора
..
...
....
10. (5 лет прошло) ВИК все еще пасется работает на проекте, но воз и ныне там, а пока для юзеров держат старый ПХП-сайт.
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Java ThreadPoolExecutor - достучаться до working threads
Я заикался про reflection на предидущей - автор ответил, что нет. И это вполне разумно, что нет. Непонятно, как переписывать за 5 минут, если допустим этот код идет как компонента с какой-то библиотекой для вашего кастомера. И он решит апгрейднуть версию Джавы. И все накроется медным тазом. Это не считая того, что нужно каким-то образом помнить, где ты чего через reflection делал и при апргрейде Джавы - инспектировать все свои рефлектные извращения на предмет соответствия.Zorkus wrote: Если единственная проблема автора в том, что нужен доступ к этой коллекции, а злые дизайнеры j.u.c. не открыли ее в паблик, то в чем проблема, через reflection, setAccessible(true) и вперед. Будет работать всегда и без всякого геморроя и оверхеда за исключением двух случаев:
1) прога работает в jvm с суперстрогим security manager, которые не дает дергать через reflection поля. Я в реальности такого не встречал ни разу.
2) в следующем JDK структура этого пуля изменится. Ну и черт с ним, во время апгрейда переписать за 5 минут на массив или чего там. Я считаю, юзать приватные апи такие вещей как j.u.c. вполне нормально и цивильно.