|
|
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
Прочитал, что ThreadPool переиспользует потоки. Я не очень понимаю как это происходит. Создали мы 2 потока например и как их переиспользовать то? мы ж в конструкторе Runnable передаём. Решил проверить кодом: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Этот код выводит почти всегда 2, но иногда и 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 18:29 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
ooops вот так надо: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. так вообще приложение зависает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 18:55 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
questioner, ахахахах Может стоит Код: java 1. 2. местами поменять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2017, 22:25 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
no56892, а разве есть какая-то разница? я думал те, что ещё в очереди будут обработаны, а новые не будут в нее добавляться Теперь проблема в том, что Thread не Comparable. странно, что с HashSet приложение заканчивается, а с ConcurrentSkipListSet - нет. Причем странно первое. надо с Collections.synchronizedSet проверить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 10:40 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
questionerТеперь проблема в том, что Thread не Comparable. А ты уверен, что он IMMUTABLE, хотя бы в рамках hashCode()? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 11:18 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
questionerКак ThreadPool переиспользует потоки? Вместо runnable который передал пользователь, тред инициализируется другим runnable, который не завершается пока пул не закрыли, ну или пока в пользовательской таске не произошел неперехваченный эксепшен, вот тред и крутится в цикле доставая из очереди задачки и засыпая пока их нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 13:13 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевquestionerТеперь проблема в том, что Thread не Comparable. А ты уверен, что он IMMUTABLE, хотя бы в рамках hashCode()? А как Comparable связано с IMMUTABLE ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 13:48 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
Вот такой тест нормальный: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 14:11 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
questionerа разве есть какая-то разница? я думал те, что ещё в очереди будут обработаны, а новые не будут в нее добавляться Справедливо, че. questionerТеперь проблема в том, что Thread не Comparable. странно, что с HashSet приложение заканчивается, а с ConcurrentSkipListSet - нет. Причем странно первое. надо с Collections.synchronizedSet проверить Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ConcurrentSkipListSet это аналог TreeSet, т.е. элементы д.б. Comparable, а вот аналог HashSet это CopyOnWriteArraySet. Соответственно, если добавить не Comparable элемент в SortedSet, то на строке (1) вылетает Exception и cdl.countDown() не выполняется и основной поток ждет бесконечно в cdl.await(). Варианта два - Сделать comparable wrapper для thread или использовать не SortedSet, например, CopyOnWriteArraySet. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 15:23 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
авторСделать comparable wrapper Кстати, это не так просто сделать, т.е. сделать Comparable для объекта, который совсем не comparable... т.к. если тупо compareTo делать thread.getHashCode() - other.getHashCode() - а если два разных по identity треда будут иметь одинаковый хэшкод... Как вариант - static BigInteger счетчик в конструкторе Wrapper'a)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 15:45 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
no56892авторСделать comparable wrapper Кстати, это не так просто сделать, т.е. сделать Comparable для объекта, который совсем не comparable... т.к. если тупо compareTo делать thread.getHashCode() - other.getHashCode() - а если два разных по identity треда будут иметь одинаковый хэшкод... Как вариант - static BigInteger счетчик в конструкторе Wrapper'a)). Со счетчиком будет другая проблема - все врапперы будут разными, даже для одинаковых по identity тредов, т.е. остается вариант - использовать не SortedSet - CopyOnWriteArraySet, Collections.synchronized(new HashSet<>()). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 15:53 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
no56892no56892пропущено... Кстати, это не так просто сделать, т.е. сделать Comparable для объекта, который совсем не comparable... т.к. если тупо compareTo делать thread.getHashCode() - other.getHashCode() - а если два разных по identity треда будут иметь одинаковый хэшкод... Как вариант - static BigInteger счетчик в конструкторе Wrapper'a)). Со счетчиком будет другая проблема - все врапперы будут разными, даже для одинаковых по identity тредов, т.е. остается вариант - использовать не SortedSet - CopyOnWriteArraySet, Collections.synchronized(new HashSet<>()). http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1250147&msg=20217787 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 15:56 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
questionerА как Comparable связано с IMMUTABLE ? Как HashMap ищет изменившийся объект знаешь? Comparable тут совсем не причем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 15:56 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевquestionerА как Comparable связано с IMMUTABLE ? Как HashMap ищет изменившийся объект знаешь? Comparable тут совсем не причем. ааа, ну да, тоже кстати проблема. Но последний тест вроде работает. Видимо в рамках этого теста immutable ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 16:02 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
no56892questionerа разве есть какая-то разница? я думал те, что ещё в очереди будут обработаны, а новые не будут в нее добавляться Справедливо, че. Сарказм? тут вроде нет никаких проблем questionerТеперь проблема в том, что Thread не Comparable. странно, что с HashSet приложение заканчивается, а с ConcurrentSkipListSet - нет. Причем странно первое. надо с Collections.synchronizedSet проверить Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ConcurrentSkipListSet это аналог TreeSet, т.е. элементы д.б. Comparable, а вот аналог HashSet это CopyOnWriteArraySet. Соответственно, если добавить не Comparable элемент в SortedSet, то на строке (1) вылетает Exception и cdl.countDown() не выполняется и основной поток ждет бесконечно в cdl.await(). Варианта два - Сделать comparable wrapper для thread или использовать не SortedSet, например, CopyOnWriteArraySet. Я к тому, что если использовать HashSet в многопоточной среде велика вероятность, что случится какая-нить кака, например ConcurrentModificationException, но не случается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 16:05 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
questioner, А чем тебя Thread.currentThread().getId() не устраивает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 16:06 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевquestioner, А чем тебя Thread.currentThread().getId() не устраивает? тем, что он может быть переиспользован после завершения потока ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 16:17 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
авторЯ к тому, что если использовать HashSet в многопоточной среде велика вероятность, что случится какая-нить кака, например ConcurrentModificationException, но не случается Хмм, насколько я помню, ты спрашивал почему виснет с ConcurrentSkipSet и не виснет с HashSet. Это не связано с использованием HashSet в 2+ потоках на запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 16:24 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевquestionerТеперь проблема в том, что Thread не Comparable. А ты уверен, что он IMMUTABLE, хотя бы в рамках hashCode()? equals/hashcode не переопределен в Thread. Кстати тынц hashCode будет привязан к месту в хипе, где объект создался. Но опять же это не гарантия, что коллизий не будет, но а equals, дефолтный вполне нормально работает. Так что в этом плане всё должно работать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 16:30 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
no56892авторЯ к тому, что если использовать HashSet в многопоточной среде велика вероятность, что случится какая-нить кака, например ConcurrentModificationException, но не случается Хмм, насколько я помню, ты спрашивал почему виснет с ConcurrentSkipSet и не виснет с HashSet. Это не связано с использованием HashSet в 2+ потоках на запись. Да, я понял это несколько раньше просто, поэтому немного сместил акценты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 16:32 |
|
||
|
Как ThreadPool переиспользует потоки?
|
|||
|---|---|---|---|
|
#18+
Отличный способ проверить то, что треды переиспользуются это так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2017, 17:46 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39405834&tid=2123139]: |
0ms |
get settings: |
6ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
59ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
| others: | 188ms |
| total: | 359ms |

| 0 / 0 |
