|
|
|
потоки
|
|||
|---|---|---|---|
|
#18+
Привет! задачка : есть 2 потока 1. слово "Petr" записывается через каждые 5 секунд 2. слово "Alex" записывается через каждые 3 секунды. и все это одновременно записывается в один файл. и файл можно просматривать в интерактивном режиме. для начала я решил написать с одним потоком, с 1. моя логика: возьму пример из хострсмана , описывающий метод callback, который выводит через каждый определенный момент времени текущее время и просто эту программу переделаю, вместо время буду делать операцию запись в файл. Код: 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. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. почему происходит запись в файл только один раз? и на правильном ли я пути? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2012, 23:17:36 |
|
||
|
потоки
|
|||
|---|---|---|---|
|
#18+
spbsmile, Какая связь между исходной задачей и свингом, где поток (имплементирующий ранобл колбл) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2012, 01:05:41 |
|
||
|
потоки
|
|||
|---|---|---|---|
|
#18+
Swing Timer работает в Event Dispatch Thread. Ваш Action всегда выполняется в одном потоке. У вас очень много лишних операций именно в методе который предполагает быть конкурентным - проверить файл, создать, записать, закрыть. Хотя открытие и закрытие это общие операции. Конкрентная только запись. Никогда не оставляйте пустых catch блоков. Вы просто не узнаете об ошибках. Закрывать IO потоки нужно в блоке finally, либо использовать синтаксиси из Java 7: http://www.baptiste-wicht.com/2010/08/java-7-try-with-resources-statement/ File*Stream очень желательно оборачивать в Buffered*Stream, иначе запись и чтение будут на много медленнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2012, 11:41:24 |
|
||
|
потоки
|
|||
|---|---|---|---|
|
#18+
Если 2 потока, то и делать нужно 2 причем, если через каждые x секунд - то это не поток свинга. Итого будет 4 потока, чтобы не заморачиваться 1. свинговый где находятся слушатели, контролы и проч 2. поток который кладет в очередь каждые x секунд нечто 3. поток который кладет в очередь каждые y секунд нечто 4. поток который каждые z секунд смотрит в очередь, и в порядке поступления из нее выбирает данные, пока там что-то есть, и пишет в файл. z может быть как наименьшим из x и y, так и произвольным. Чтобы управлять потоками, они должны поддерживать какие-то команды, которые будут поступать из свинга. Мыслите о потоках как об отдельных субъектах, клерках в бюрократической конторе, рабочих на конвейере - каждый занят своей работой, ему приходит задание или команда, он ее выполняет. Тот кто дал ему задание - не ждет выполнения, а занимается своими делами. Или ждет когда ему дадут задание, или команду - все на обед! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2012, 11:57:15 |
|
||
|
потоки
|
|||
|---|---|---|---|
|
#18+
SkyNIN, Не надо ничего по таймеру проверять. Все потоки которые передают информацию, кладут их в BlockingQueue ( см javax.nio для подходящей реализации ). Поток который пишет в фаил читает в цикле из очереди и записывает. Если в очереди нет данных, он просто перейдет в режим ожидания. Ну и естественно все ошибочные ситуации обрабатывать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2012, 09:11:48 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37719056&tid=2132230]: |
0ms |
get settings: |
14ms |
get forum list: |
31ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
71ms |
get topic data: |
24ms |
get forum data: |
6ms |
get page messages: |
89ms |
get tp. blocked users: |
3ms |
| others: | 357ms |
| total: | 609ms |

| 0 / 0 |
