Плюсы и минусы многопоточных приложений — КиберПедия 

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Плюсы и минусы многопоточных приложений

2022-10-10 49
Плюсы и минусы многопоточных приложений 0.00 из 5.00 0 оценок
Заказать работу

http://tutorials.jenkov.com/java-concurrency/index.html

Вот этот вариант, он может быть, конечно, излишне подробен и коллеге придется напрягаться. Но зато здесь в коде коллеге будет четко написано «newThread». И может быть спустя неделю будет понятно, что запускается поток. Запустите, 10, 100, 1000, 100000 потоков. Где-то рано или поздно ваша программа рухнет. Ресурс кончится. Поэтому можете попробовать поиграться. А вдруг это будет в цикле? А вдруг это будет рекурсия бесконечная? И к чему это все может привести? Человек же понимает, что я «создаю поток-создаю поток-создаю поток». А если эти строчки убрать, и написать вот так?

Ничего не видно. Он скажет, да тут объект сборщик мусора уберет. Ага! Там не просто объект, а поток! А это ресурс операционной системы. Поэтому не факт. И однозначного выбора нет. Я не могу сказать «пишите вот так». Вот вариант с интерфейсом – это хороший вариант. А из этих двух подвариантов выбирать вам в способе №2. Если это все ваш код, то что от себя прятать?

Т.е. здесь идея в том, что если вы пишите свой код целиком, то разумно 1 раз упаковать в конструктор создания потока и больше про это не вспоминать. Но вы как автор всегда будете помнить «там поток!».

Создание потока: Способ третий

Это просто вариация второго. Мы реализуем интерфейс Runnable, как объект анонимного класса. Это компактный вариант для запуска потока.

Ожидание завершения потока

Что мы еще должны понимать из того, что мы разбирали? Я сказал «Thread.start», а когда этот поток завершится? Не знаю. А как вообще узнать? Есть несколько подходов:

Первый подход (в лоб):

Вызываем метод isAlive. Т.е. в цикле мы спрашиваем поток «Ты живой? Он говорит, да». Ну значит данных еще нет. Т.е. получается, что main в этот момент загружен. И когда вы вызываете этот метод, то в общем-то, вы делаете лишнюю работу, которую приходится выполнять процессору и это считается дополнительной нагрузкой. Помните в прошлом курсе мы говорили про пуллинг? Мы здесь занимаемся пуллингом. Мы спрашиваем, а как часто вы будете вызывать isAlive? Неизвестно. Можно спрашивать раз в час, чтобы никого не напрягать? Если есть какой-то логичный временной диапазон выполнения задачи, то может быть это можно как-то оформить. Ну а так, не получится.

Разработчики знали, что в 90% случаев этот вариант не пройдет. И для этого они создали метод join(). Во-первых, вы должны понимать, что вызов join() останавливает один из потоков. У нас здесь их сейчас 2: главный и Thread. При вызове join() мой главный поток останавливается и ждет пока не завершится thread. Вот я запустил другие потоки и говорю «О! Мне нужны данные! Я не могу ничего дальше делать». Видите многоточия перед try? Я что-то поделал, но все что мне нужно было сделать – я сделал. А дальше мне нужны данные. Я говорю «Ждем» - thread.join(), всё. Главный поток останавливается, пока не завершится thread. А если он не завершится? Вдруг он зациклился? Значит и вы не завершитесь. Будете ждать бесконечно.

Поэтому здесь есть вариант с максимальным временем ожидания. Например, 1000 миллисекунд. join(1000). Я говорю, я буду ждать, но не больше секунды. Но вот это уже безопасно, понимаете, да?

Первый проект

ЗапускаемNetbeans. Demo1. Вы видите, что в данном проекте написано три класса:

· Main

· MyThread1

· MyThread2

Давайте откроем MyThread1.

В этой программе у нас получается следующее. В методе run() 30 раз с помощью systemout.printlnпишется name =, и вот дальше обратите внимание на полезную функцию currentThread. В классе Threadу вас есть статическая функция currentThread. Вы всегда в любом месте кода можете спросить, какой поток сейчас этот код выполняет? И мне возвращают ссылку на тот поток, который сейчас выполняет этот код. И в методе runэто повторяется 30 раз. Это вариант с наследованием.

Теперь откроем MyThread2

Соответственно, если вы откроете второй, то тут все то же самое, только с интерфейсом.

Теперь откроем Main

В Main создается два объекта: mtи omt. На mt непосредственно вызывается start, потому что он наследует от Thread. А второй через ссылку. В любом случае они начинают работу и каждый делает по 5 итераций.

Надо отметить, что это недетерминированная работа программы. В этой системы мы можем поиграться с потоками. Давайте поменяем первому потоку приоритет. Какой будем делать приоритет – больше или меньше? Давайте сделаем больше.

Открываем класс Main. И перед запуском start, мы должны поменять приоритет. Я пишу mt.setPriority. Приоритеты выбираются из констант, которые лежат в классе Thread. Поэтому в круглых скобках вы пишете «Thread.MAX_PRIORITY». Теперь первый поток получил наибольший возможный приоритет, который возможен в Java.

 

end of main Name = Thread-1, i = 0 Name = Thread-0, i = 0 Name = Thread-1, i = 1 Name = Thread-0, i = 1 Name = Thread-1, i = 2 Name = Thread-0, i = 2 Name = Thread-1, i = 3 Name = Thread-0, i = 3 Name = Thread-1, i = 4 Name = Thread-0, i = 4 СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)

Ха! Приоритет мы ему «повысили»! Он даже первым не смог стартовать и последним завершился. Когда вы меняется приоритеты, то результат определяется операционной системой.

Зачемэтосделано? Понимаете, авторы, которые создавали это все потоки и классы, они понимали, что лишить нас вообще управления (ну пусть иллюзии управления) они не могут. А вдруг когда-нибудь будет ОС, которая на это будет откликаться? Если они не оставят возможности управлять, то даже если такая ОС появится, то вы ничего не сможете сделать. Мы хотим, чтобы этот поток получал больше процессорного времени.

А теперь давайте мы сделаем, что-нибудь серьезное. Давайте мы поток сделаем «демоном», а это значит

у нас mainзакончился. А если mainзакончился, то потоки должны выключить. Если мы MyThread1 сделаем «демоном», то он не будет работать. Мы увидим, что его выключат.

Проверяем. Жмем F6.

end of main Name = Thread-0, i = 0 Name = Thread-1, i = 0 Name = Thread-0, i = 1 Name = Thread-1, i = 1 Name = Thread-0, i = 2 Name = Thread-1, i = 2 Name = Thread-0, i = 3 Name = Thread-1, i = 3 Name = Thread-0, i = 4 Name = Thread-1, i = 4 СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд) end of main Name = Thread-1, i = 0 Name = Thread-0, i = 0 Name = Thread-1, i = 1 Name = Thread-0, i = 1 Name = Thread-1, i = 2 Name = Thread-0, i = 2 Name = Thread-1, i = 3 Name = Thread-0, i = 3 Name = Thread-1, i = 4 Name = Thread-0, i = 4 СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд) end of main Name = Thread-0, i = 0 Name = Thread-1, i = 0 Name = Thread-0, i = 1 Name = Thread-1, i = 1 Name = Thread-0, i = 2 Name = Thread-1, i = 2 Name = Thread-0, i = 3 Name = Thread-1, i = 3 Name = Thread-0, i = 4 Name = Thread-1, i = 4 СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)
end of main Name = Thread-1, i = 0 Name = Thread-1, i = 1 Name = Thread-1, i = 2 Name = Thread-1, i = 3 Name = Thread-1, i = 4 Name = Thread-0, i = 0 Name = Thread-0, i = 1 Name = Thread-0, i = 2 СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)    

Наконец-то сработало, но только с 100-ой попытки.

На самом деле здесь абсолютно четкая логика. Давайте задумаемся, что значит «поток должны отключить»? Это значит, должны отлучить процессорное время виртуальной машины. Правильно? Ктопотоквыключит? Ясделалпотокдемоном, ноктоеговыключит? Ончто, самвыключается? Нет, виртуальнаямашина. Ачтобывиртуальнаямашинаеговыключилаонадолжнаполучитьпроцессорноевремя? Конечно.

Т.е. смотрите, чтоможетпроизойти. Вы стартуете систему из трех потоков: главный и два вспомогательных (один из них «демон»). Он успевает завершить работу до того, как ОС дает виртуальной машине процессорное время, чтобы найти этих демонов и выключить. Он просто проскакивает. Виртуальная машина не успела вмешаться, он уже завершился. А с 100-ой попытки успела! Вы поставьте потоку, который является демоном не 5, а 300, тогда ОС всегда успеет вмешаться, но а когда это произойдет это опять не детерминировано. Т.е. когда получит время виртуальная машина – вы не знаете.

Зачем нам нужны дополнительные потоки? Чтобы не было ожиданий. Чтобы пользовательский интерфейс не блокировался.

Еще раз…

У нас получил процессорное время главный поток Main. Потом в какой-то момент получили процессорное время потоки 1-ый и 2-ой. Представьте себе, что Main еще не закончился. И эти потоки начали работать. В какой-то момент закончил работать главный поток. Это будет для виртуальной машины поводом демонов всех повыключать. Но ведь виртуальная машина – это тоже поток. Пока ей не выделят процессорное время, она ничего не может контролировать. В ОС много потоков. Если вы не поленитесь и запустите какую-нибудь утилиту, которая показывает сколько на вашем компьютере запущено потоков сейчас, то вы придете в ужас и начнете искать, кто это безобразие запустил.

Идем дальше…

Что будет, если я напишу mt.join()? Здесь у нас все четко и понятно. Главный поток будет остановлен в этом вызове join() до тех пор пока mt не завершится.

Он выполнит до конца все свои 499 итераций и главный поток завершается.

Name = Thread-0, i = 0 Name = Thread-0, i = 1 Name = Thread-1, i = 0 Name = Thread-0, i = 2 Name = Thread-1, i = 1 Name = Thread-0, i = 3 Name = Thread-1, i = 2 Name = Thread-0, i = 4 Name = Thread-1, i = 3 Name = Thread-0, i = 5 Name = Thread-1, i = 4 Name = Thread-0, i = 6 Name = Thread-0, i = 7 Name = Thread-0, i = 8 Name = Thread-0, i = 9 Name = Thread-0, i = 10 Name = Thread-0, i = 11 Name = Thread-0, i = 12 Name = Thread-0, i = 13 Name = Thread-0, i = 14 Name = Thread-0, i = 15 Name = Thread-0, i = 16 Name = Thread-0, i = 17 Name = Thread-0, i = 18 Name = Thread-0, i = 19 Name = Thread-0, i = 20 Name = Thread-0, i = 21 Name = Thread-0, i = 22 Name = Thread-0, i = 23 Name = Thread-0, i = 24 Name = Thread-0, i = 25 Name = Thread-0, i = 26 Name = Thread-0, i = 27 Name = Thread-0, i = 28 Name = Thread-0, i = 29 Name = Thread-0, i = 30 Name = Thread-0, i = 31 Name = Thread-0, i = 32 Name = Thread-0, i = 33 Name = Thread-0, i = 34 Name = Thread-0, i = 35 Name = Thread-0, i = 36 Name = Thread-0, i = 37 Name = Thread-0, i = 38 Name = Thread-0, i = 39 Name = Thread-0, i = 40 Name = Thread-0, i = 41 Name = Thread-0, i = 42 Name = Thread-0, i = 43 Name = Thread-0, i = 44 Name = Thread-0, i = 45 Name = Thread-0, i = 46 Name = Thread-0, i = 47 Name = Thread-0, i = 48 Name = Thread-0, i = 49 Name = Thread-0, i = 50 Name = Thread-0, i = 51 Name = Thread-0, i = 52 Name = Thread-0, i = 53 Name = Thread-0, i = 54 Name = Thread-0, i = 55 Name = Thread-0, i = 56 Name = Thread-0, i = 57 Name = Thread-0, i = 58 Name = Thread-0, i = 59 Name = Thread-0, i = 60 Name = Thread-0, i = 61 Name = Thread-0, i = 62 Name = Thread-0, i = 63 Name = Thread-0, i = 64 Name = Thread-0, i = 65 Name = Thread-0, i = 66 Name = Thread-0, i = 67 Name = Thread-0, i = 68 Name = Thread-0, i = 69 Name = Thread-0, i = 70 Name = Thread-0, i = 71 Name = Thread-0, i = 72 Name = Thread-0, i = 73 Name = Thread-0, i = 74 Name = Thread-0, i = 75 Name = Thread-0, i = 76 Name = Thread-0, i = 77 Name = Thread-0, i = 78 Name = Thread-0, i = 79 Name = Thread-0, i = 80 Name = Thread-0, i = 81 Name = Thread-0, i = 82 Name = Thread-0, i = 83 Name = Thread-0, i = 84 Name = Thread-0, i = 85 Name = Thread-0, i = 86 Name = Thread-0, i = 87 Name = Thread-0, i = 88 Name = Thread-0, i = 89 Name = Thread-0, i = 90 Name = Thread-0, i = 91 Name = Thread-0, i = 92 Name = Thread-0, i = 93 Name = Thread-0, i = 94 Name = Thread-0, i = 95 Name = Thread-0, i = 96 Name = Thread-0, i = 97 Name = Thread-0, i = 98 Name = Thread-0, i = 99 Name = Thread-0, i = 100 Name = Thread-0, i = 101 Name = Thread-0, i = 102 Name = Thread-0, i = 103 Name = Thread-0, i = 104 Name = Thread-0, i = 105 Name = Thread-0, i = 106 Name = Thread-0, i = 107 Name = Thread-0, i = 108 Name = Thread-0, i = 109 Name = Thread-0, i = 110 Name = Thread-0, i = 111 Name = Thread-0, i = 112 Name = Thread-0, i = 113 Name = Thread-0, i = 114 Name = Thread-0, i = 115 Name = Thread-0, i = 116 Name = Thread-0, i = 117 Name = Thread-0, i = 118 Name = Thread-0, i = 119 Name = Thread-0, i = 120 Name = Thread-0, i = 121 Name = Thread-0, i = 122 Name = Thread-0, i = 123 Name = Thread-0, i = 124   Name = Thread-0, i = 125 Name = Thread-0, i = 126 Name = Thread-0, i = 127 Name = Thread-0, i = 128 Name = Thread-0, i = 129 Name = Thread-0, i = 130 Name = Thread-0, i = 131 Name = Thread-0, i = 132 Name = Thread-0, i = 133 Name = Thread-0, i = 134 Name = Thread-0, i = 135 Name = Thread-0, i = 136 Name = Thread-0, i = 137 Name = Thread-0, i = 138 Name = Thread-0, i = 139 Name = Thread-0, i = 140 Name = Thread-0, i = 141 Name = Thread-0, i = 142 Name = Thread-0, i = 143 Name = Thread-0, i = 144 Name = Thread-0, i = 145 Name = Thread-0, i = 146 Name = Thread-0, i = 147 Name = Thread-0, i = 148 Name = Thread-0, i = 149 Name = Thread-0, i = 150 Name = Thread-0, i = 151 Name = Thread-0, i = 152 Name = Thread-0, i = 153 Name = Thread-0, i = 154 Name = Thread-0, i = 155 Name = Thread-0, i = 156 Name = Thread-0, i = 157 Name = Thread-0, i = 158 Name = Thread-0, i = 159 Name = Thread-0, i = 160 Name = Thread-0, i = 161 Name = Thread-0, i = 162 Name = Thread-0, i = 163 Name = Thread-0, i = 164 Name = Thread-0, i = 165 Name = Thread-0, i = 166 Name = Thread-0, i = 167 Name = Thread-0, i = 168 Name = Thread-0, i = 169 Name = Thread-0, i = 170 Name = Thread-0, i = 171 Name = Thread-0, i = 172 Name = Thread-0, i = 173 Name = Thread-0, i = 174 Name = Thread-0, i = 175 Name = Thread-0, i = 176 Name = Thread-0, i = 177 Name = Thread-0, i = 178 Name = Thread-0, i = 179 Name = Thread-0, i = 180 Name = Thread-0, i = 181 Name = Thread-0, i = 182 Name = Thread-0, i = 183 Name = Thread-0, i = 184 Name = Thread-0, i = 185 Name = Thread-0, i = 186 Name = Thread-0, i = 187 Name = Thread-0, i = 188 Name = Thread-0, i = 189 Name = Thread-0, i = 190 Name = Thread-0, i = 191 Name = Thread-0, i = 192 Name = Thread-0, i = 193 Name = Thread-0, i = 194 Name = Thread-0, i = 195 Name = Thread-0, i = 196 Name = Thread-0, i = 197 Name = Thread-0, i = 198 Name = Thread-0, i = 199 Name = Thread-0, i = 200 Name = Thread-0, i = 201 Name = Thread-0, i = 202 Name = Thread-0, i = 203 Name = Thread-0, i = 204 Name = Thread-0, i = 205 Name = Thread-0, i = 206 Name = Thread-0, i = 207 Name = Thread-0, i = 208 Name = Thread-0, i = 209 Name = Thread-0, i = 210 Name = Thread-0, i = 211 Name = Thread-0, i = 212 Name = Thread-0, i = 213 Name = Thread-0, i = 214 Name = Thread-0, i = 215 Name = Thread-0, i = 216 Name = Thread-0, i = 217 Name = Thread-0, i = 218 Name = Thread-0, i = 219 Name = Thread-0, i = 220 Name = Thread-0, i = 221 Name = Thread-0, i = 222 Name = Thread-0, i = 223 Name = Thread-0, i = 224 Name = Thread-0, i = 225 Name = Thread-0, i = 226 Name = Thread-0, i = 227 Name = Thread-0, i = 228 Name = Thread-0, i = 229 Name = Thread-0, i = 230 Name = Thread-0, i = 231 Name = Thread-0, i = 232 Name = Thread-0, i = 233 Name = Thread-0, i = 234 Name = Thread-0, i = 235 Name = Thread-0, i = 236 Name = Thread-0, i = 237 Name = Thread-0, i = 238 Name = Thread-0, i = 239 Name = Thread-0, i = 240 Name = Thread-0, i = 241 Name = Thread-0, i = 242 Name = Thread-0, i = 243 Name = Thread-0, i = 244 Name = Thread-0, i = 245 Name = Thread-0, i = 246 Name = Thread-0, i = 247 Name = Thread-0, i = 248 Name = Thread-0, i = 249 Name = Thread-0, i = 250 Name = Thread-0, i = 251 Name = Thread-0, i = 252 Name = Thread-0, i = 253 Name = Thread-0, i = 254   Name = Thread-0, i = 255 Name = Thread-0, i = 256 Name = Thread-0, i = 257 Name = Thread-0, i = 258 Name = Thread-0, i = 259 Name = Thread-0, i = 260 Name = Thread-0, i = 261 Name = Thread-0, i = 262 Name = Thread-0, i = 263 Name = Thread-0, i = 264 Name = Thread-0, i = 265 Name = Thread-0, i = 266 Name = Thread-0, i = 267 Name = Thread-0, i = 268 Name = Thread-0, i = 269 Name = Thread-0, i = 270 Name = Thread-0, i = 271 Name = Thread-0, i = 272 Name = Thread-0, i = 273 Name = Thread-0, i = 274 Name = Thread-0, i = 275 Name = Thread-0, i = 276 Name = Thread-0, i = 277 Name = Thread-0, i = 278 Name = Thread-0, i = 279 Name = Thread-0, i = 280 Name = Thread-0, i = 281 Name = Thread-0, i = 282 Name = Thread-0, i = 283 Name = Thread-0, i = 284 Name = Thread-0, i = 285 Name = Thread-0, i = 286 Name = Thread-0, i = 287 Name = Thread-0, i = 288 Name = Thread-0, i = 289 Name = Thread-0, i = 290 Name = Thread-0, i = 291 Name = Thread-0, i = 292 Name = Thread-0, i = 293 Name = Thread-0, i = 294 Name = Thread-0, i = 295 Name = Thread-0, i = 296 Name = Thread-0, i = 297 Name = Thread-0, i = 298 Name = Thread-0, i = 299 Name = Thread-0, i = 300 Name = Thread-0, i = 301 Name = Thread-0, i = 302 Name = Thread-0, i = 303 Name = Thread-0, i = 304 Name = Thread-0, i = 305 Name = Thread-0, i = 306 Name = Thread-0, i = 307 Name = Thread-0, i = 308 Name = Thread-0, i = 309 Name = Thread-0, i = 310 Name = Thread-0, i = 311 Name = Thread-0, i = 312 Name = Thread-0, i = 313 Name = Thread-0, i = 314 Name = Thread-0, i = 315 Name = Thread-0, i = 316 Name = Thread-0, i = 317 Name = Thread-0, i = 318 Name = Thread-0, i = 319 Name = Thread-0, i = 320 Name = Thread-0, i = 321 Name = Thread-0, i = 322 Name = Thread-0, i = 323 Name = Thread-0, i = 324 Name = Thread-0, i = 325 Name = Thread-0, i = 326 Name = Thread-0, i = 327 Name = Thread-0, i = 328 Name = Thread-0, i = 329 Name = Thread-0, i = 330 Name = Thread-0, i = 331 Name = Thread-0, i = 332 Name = Thread-0, i = 333 Name = Thread-0, i = 334 Name = Thread-0, i = 335 Name = Thread-0, i = 336 Name = Thread-0, i = 337 Name = Thread-0, i = 338 Name = Thread-0, i = 339 Name = Thread-0, i = 340 Name = Thread-0, i = 341 Name = Thread-0, i = 342 Name = Thread-0, i = 343 Name = Thread-0, i = 344 Name = Thread-0, i = 345 Name = Thread-0, i = 346 Name = Thread-0, i = 347 Name = Thread-0, i = 348 Name = Thread-0, i = 349 Name = Thread-0, i = 350 Name = Thread-0, i = 351 Name = Thread-0, i = 352 Name = Thread-0, i = 353 Name = Thread-0, i = 354 Name = Thread-0, i = 355 Name = Thread-0, i = 356 Name = Thread-0, i = 357 Name = Thread-0, i = 358 Name = Thread-0, i = 359 Name = Thread-0, i = 360 Name = Thread-0, i = 361 Name = Thread-0, i = 362 Name = Thread-0, i = 363 Name = Thread-0, i = 364 Name = Thread-0, i = 365 Name = Thread-0, i = 366 Name = Thread-0, i = 367 Name = Thread-0, i = 368 Name = Thread-0, i = 369 Name = Thread-0, i = 370 Name = Thread-0, i = 371 Name = Thread-0, i = 372 Name = Thread-0, i = 373 Name = Thread-0, i = 374 Name = Thread-0, i = 375 Name = Thread-0, i = 376 Name = Thread-0, i = 377 Name = Thread-0, i = 378 Name = Thread-0, i = 379 Name = Thread-0, i = 380 Name = Thread-0, i = 381 Name = Thread-0, i = 382 Name = Thread-0, i = 383 Name = Thread-0, i = 384   Name = Thread-0, i = 385 Name = Thread-0, i = 386 Name = Thread-0, i = 387 Name = Thread-0, i = 388 Name = Thread-0, i = 389 Name = Thread-0, i = 390 Name = Thread-0, i = 391 Name = Thread-0, i = 392 Name = Thread-0, i = 393 Name = Thread-0, i = 394 Name = Thread-0, i = 395 Name = Thread-0, i = 396 Name = Thread-0, i = 397 Name = Thread-0, i = 398 Name = Thread-0, i = 399 Name = Thread-0, i = 400 Name = Thread-0, i = 401 Name = Thread-0, i = 402 Name = Thread-0, i = 403 Name = Thread-0, i = 404 Name = Thread-0, i = 405 Name = Thread-0, i = 406 Name = Thread-0, i = 407 Name = Thread-0, i = 408 Name = Thread-0, i = 409 Name = Thread-0, i = 410 Name = Thread-0, i = 411 Name = Thread-0, i = 412 Name = Thread-0, i = 413 Name = Thread-0, i = 414 Name = Thread-0, i = 415 Name = Thread-0, i = 416 Name = Thread-0, i = 417 Name = Thread-0, i = 418 Name = Thread-0, i = 419 Name = Thread-0, i = 420 Name = Thread-0, i = 421 Name = Thread-0, i = 422 Name = Thread-0, i = 423 Name = Thread-0, i = 424 Name = Thread-0, i = 425 Name = Thread-0, i = 426 Name = Thread-0, i = 427 Name = Thread-0, i = 428 Name = Thread-0, i = 429 Name = Thread-0, i = 430 Name = Thread-0, i = 431 Name = Thread-0, i = 432 Name = Thread-0, i = 433 Name = Thread-0, i = 434 Name = Thread-0, i = 435 Name = Thread-0, i = 436 Name = Thread-0, i = 437 Name = Thread-0, i = 438 Name = Thread-0, i = 439 Name = Thread-0, i = 440 Name = Thread-0, i = 441 Name = Thread-0, i = 442 Name = Thread-0, i = 443 Name = Thread-0, i = 444 Name = Thread-0, i = 445 Name = Thread-0, i = 446 Name = Thread-0, i = 447 Name = Thread-0, i = 448 Name = Thread-0, i = 449 Name = Thread-0, i = 450 Name = Thread-0, i = 451 Name = Thread-0, i = 452 Name = Thread-0, i = 453 Name = Thread-0, i = 454 Name = Thread-0, i = 455 Name = Thread-0, i = 456 Name = Thread-0, i = 457 Name = Thread-0, i = 458 Name = Thread-0, i = 459 Name = Thread-0, i = 460 Name = Thread-0, i = 461 Name = Thread-0, i = 462 Name = Thread-0, i = 463 Name = Thread-0, i = 464 Name = Thread-0, i = 465 Name = Thread-0, i = 466 Name = Thread-0, i = 467 Name = Thread-0, i = 468 Name = Thread-0, i = 469 Name = Thread-0, i = 470 Name = Thread-0, i = 471 Name = Thread-0, i = 472 Name = Thread-0, i = 473 Name = Thread-0, i = 474 Name = Thread-0, i = 475 Name = Thread-0, i = 476 Name = Thread-0, i = 477 Name = Thread-0, i = 478 Name = Thread-0, i = 479 Name = Thread-0, i = 480 Name = Thread-0, i = 481 Name = Thread-0, i = 482 Name = Thread-0, i = 483 Name = Thread-0, i = 484 Name = Thread-0, i = 485 Name = Thread-0, i = 486 Name = Thread-0, i = 487 Name = Thread-0, i = 488 Name = Thread-0, i = 489 Name = Thread-0, i = 490 Name = Thread-0, i = 491 Name = Thread-0, i = 492 Name = Thread-0, i = 493 Name = Thread-0, i = 494 Name = Thread-0, i = 495 Name = Thread-0, i = 496 Name = Thread-0, i = 497 Name = Thread-0, i = 498 Name = Thread-0, i = 499 end of main СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)

 

Идем дальше…

Как вообще поток завершается? Мы ждем когда он завершится. А как он завершается? А вот смотрите:

Вариант 1: В этом методе, в котором поток был вызван (точке входа) – а это у нас run – сработает return. Т.е. он сам нормально, по-человечески завершится. Это хороший вариант.

Вариант 2: Мы его делаем «демоном» и если наш главный поток завершился, то этого демона останавливают, когда дойдут руки.

Вариант 3: В свое время в классе Threadбыли изобретены методы типа stop.  Я могу сказать потоку, остановить его. И это оказалось полным безобразием и данный метод был помечен, как «deprecated». Выспросите, азачемделали? Ответ: Учились. Аможноизбиблиотекиубратьметодstop? Нет. Почему это может оказаться небезопасно вызывать stop? А потому что вы вызываете для какого-то потока извне stopи вы его просто останавливаете принудительно. А это что означает? А если он в БД данные сохраняет? Все. Потеря данных. Поэтому при наличии stop’ов гарантировать надежность работы с данными мы не можем. Поэтому в большом серьезном проекте мы вы должны провести ревизию кода. Хорошо, что Intellisenceпоказывает эти методы.

Поэтому вариант №3 для нас исключается. Так поток завершить нельзя. А первые два не всегда работают. Представьте, что поток зациклился и не хочет завершаться, и как-то хотелось бы остановить его что ли. Поэтому единственный способ извне (культурно) завершить поток – это через исключения, и он через try-catchзавершается. Ну что, скажем потоку interrupt? Давайте попробуем.


Поделиться с друзьями:

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.028 с.