Коли жива смуга Java?

Це досить просте запитання про словниковий запас нитей Java.

Я не бачу будь-яких можливих дублікатів, але це може бути.

Що означає слово живий в документації Oracles?

Це коли метод run() ще не завершений, або це якийсь інший параметр?

16
Відповідь тут: " Потік живий, якщо він був запущений і ще не вмер ". Це посилання також має допомогти вам: journals.ecs.soton .ac.uk/java/tutorial/java/threads/states.h & zwnj; tml
додано Автор Maroun, джерело
Дякую за цю діаграму. Це було дійсно корисним.
додано Автор Einar Sundgren, джерело

7 Відповіді

За словами Джавадока, ви згадали:

Потік живий, якщо він був запущений і ще не вмер.

Потік "запускається", коли його метод start() викликається і закінчується методом run() або коли stop() (тепер застарілий) викликається. Так, так, потік "живий", коли його метод run() все ще триває, але воно також "живе" у вікні часу між викликом start() і приховане виклик методу run() JVM.

Ви також можете перевірити < код> Thread.getState() і цікаві відомості про теми держав , запропоновані @ Marou Maroun.

Я також слідкую за його пропозицією, що попереджає вас, що нитка може закінчуватися передчасно у випадку виключення виключення, яке поширюється за межами run . В цьому випадку Thread більше не буде живим.

РЕДАГУВАТИ: як сказав @zakkak, потоку можна вважати живим, навіть якщо метод run() ще не розпочався. Якщо ви хочете мати належний контроль щодо того, коли воно буде викликати, скористайтеся ScheduledExecutorService , зокрема schedule() , який дає точніший графік виконання.

23
додано
Просто пам'ятайте, що Thread # stop - це не що інше, як асинхронне видалення виключення. Якщо це виключення не призводить до переривання методу запуску, потік живе.
додано Автор Marko Topolnik, джерело
@MarounMaroun Я нещодавно це зрозумів, розповсюджуючи слово зараз :) Документація це заявляє, але в такому круговороті, як це звучить, як виняток викидається без шансів ловити його.
додано Автор Marko Topolnik, джерело
Я помітив, що ви додали його, я видалив мій коментар. Ви також повинні зауважити, що виняток може бути скинутий і вбити нитку.
додано Автор Maroun, джерело
Це все твоє :) Добре пояснена відповідь.
додано Автор Maroun, джерело
@MarkoTopolnik Ціну інформацію! Дякую.
додано Автор Maroun, джерело
Я оновив мою відповідь, щоб включити вашу посилання та свій коментар. Тепер вам половина :)
додано Автор Matthieu, джерело
@zakkak це цитата з javadoc. Як тільки було викликано start() , ви не маєте права керувати тим, коли потоку буде запущено, але, відповідно до вашої JVM, це має бути не більше кількох мс.
додано Автор Matthieu, джерело
@zakkak, ви повинні зробити деякі асимптотики: як указує javadoc, коли ви називаєте start() , ви повинні припустити, що ваш потік запущений. Якщо вам потрібний точний контроль над вашим run() , слід використовувати Runnable в ScheduledExecutorService або ОС з планувальником реального часу ( з відповідним JVM). Я побачу, як я можу оновити свою відповідь з урахуванням цього.
додано Автор Matthieu, джерело
@zakkak спасибі за редагування! Ви зробили це, перш ніж я міг захопити комп'ютер;) Я також міг би додати про ScheduledExecutorService , щоб більше контролювати початок поточного "реального" потоку.
додано Автор Matthieu, джерело
Я не впевнений, що "було запущено і ще не вмерло" означає, що його метод run() запущений, тобто він міг почати start() , але не був заплановано ще, так що run() ще не починається.
додано Автор zakkak, джерело
@ Маттіє, ви маєте рацію, але, залежно від контексту, ці кілька мс (або, можливо, більше, якщо ви надсилаєте написи для ядер) може бути дуже важливим, тому відповідь може бути оманливою.
додано Автор zakkak, джерело

Потік живий, коли він знаходиться в новому/Running/wait state. По суті, метод run може працювати чи ні

2
додано
Ви маєте start() Thread для того, щоб він був живий: MyThread t = new MyThread (); t.isAlive (); повертає "false"
додано Автор Matthieu, джерело

Потік живий після початку (), і до запуску() повертається до JVM.

1
додано

Потік живий, коли на нього викликається метод start і до того, як він буде загинуто. Він може рухатись до очікуваного стану, скільки разів, перш ніж він помер, навіть якщо він знаходиться в стані очікування, він все ще живий.

Від того, щоб бути живим до мертвих, він може перейти від стану runnable до стану waiting .

1
додано

Потік вважається живим з того моменту, коли ви створюєте об'єкт Thread і запускаєте його, доки не завершить метод виконання або не помре. Буде сказано, що він перебуває в стані живого, навіть якщо він перебуває у режимі очікування, пробігу або сну.

0
додано

Тема "Alive" означає, що Thread продовжує працювати.

Так, ви можете сказати, що метод run() виконує для Alive Thread.

Крім того, метод isAlive() використовується для знаходження, чи продовжується Thread.

final boolean isAlive()

Метод isAlive() повертає істину, якщо нитка, на яку вона викликається, все ще працює. В іншому випадку він повертає помилку.

0
додано
Що буде, коли Алів повернеться, коли нитка знаходиться в стані очікування?
додано Автор divine, джерело

Потік живий, коли він перебуває в Новому стані або в режимі запуску/очікування. І ми також можемо сказати, що поки потік не помер, він буде живий у пам'яті.

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників