![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| GIK |
|
|||
![]() Добрый человек ![]() ![]() Профиль Группа: Участник Сообщений: 985 Регистрация: 3.6.2005 Где: я только не небыв ал Репутация: нет Всего: 14 |
Всем привет.
В данный момент разбираю потоки, и у меня возникло пара вопросов. 1) Почему обращение Thread.sleep(500); происходит именно так, а не t.sleep(500);, что для меня логичней было бы, т.е. почему обращаются именно к классу Thread, а не к его экземпляру. 2) Еще мне не понятна конструкция Thread.sleep(500); тем что она может вызвать исключение типа InterruptedException , ЕСЛИ бы кокой нибуть поток прервал его ожидание. Как я понял потоком который прерывает ожидание, может является ГЛАВНЫЙ поток, НО в свою очередь потоки используют процессор ВМЕСТЕ. Тут то я и запутался окончательно. Вот код:
-------------------- Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!! Программирование - это не деятельнось! Программирование - это состояние души! Бог - самый крутой программист. |
|||
|
||||
| redrick |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 547 Регистрация: 7.1.2004 Где: Москва Репутация: 3 Всего: 5 |
как можно попросить прекратить выполнение тред кооторый не выполняется ? Соответственно если бы он был у экземпляра, то его можно было бы вызвать когда поток не выполняется - и тогда не понятно что делать.
- действительно ГЛАВНЫЙ (надеюсь ты под ним подразумеваешь тот который выполняется ссейчас)
это чисто такое, общее выражение. На самом деле понятно, что если у тебя в машине 1 процессор, то в каждый момент времени выполняется код 1го треда - того самом currently executing Выражение "используют вместе" - означает что шедуллер попеременно ставит то одного то другого и снаружи выглядит как буддто они вместе потихоньку работают. Это сообщение отредактировал(а) redrick - 13.1.2006, 19:45 -------------------- Имею Мнение Хрен Оспоришь |
||||||
|
|||||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Thread.sleep(500); то же самое, что и Thread.currentThread().sleep(500), т.е. на самом деле текущий поток тормозится. А прервать его может любой другой поток, имеющий ссылку на текущий.
sleep() надо использовать если вы не предполагаете его прерывать. Если же вы хотите поток "разбудить" из другого потока, то надо использовать wait() - notify(). |
|||
|
||||
| GIK |
|
||||||||
![]() Добрый человек ![]() ![]() Профиль Группа: Участник Сообщений: 985 Регистрация: 3.6.2005 Где: я только не небыв ал Репутация: нет Всего: 14 |
Т.е. Thread - это всегда поток который выполняется ?
Понял.
А как эта ссылка может реализоваться, именно в данном примере, и именно на дочерний поток? -------------------- Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!! Программирование - это не деятельнось! Программирование - это состояние души! Бог - самый крутой программист. |
||||||||
|
|||||||||
| LSD |
|
||||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Не совсем. Thread - это класс, а Thread.sleep(500) - это вызов статического метода у этого класса. Просто он вызывает засыпание для того потока из которого был вызван.
Так:
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||||
|
|||||||
| GIK |
|
|||
![]() Добрый человек ![]() ![]() Профиль Группа: Участник Сообщений: 985 Регистрация: 3.6.2005 Где: я только не небыв ал Репутация: нет Всего: 14 |
Извяюсь что поднимаю старый вопрос, просто возникли непонятки.
Почемуто при запуске потока в экземпляре b (B b = new B(a,"super");), сразу через run(), реализуется только один поток (действие), т.е. другие, пока незакончится этот, просто бездействуют? И еще странно что t.sleep(1000); вроде как работает, но вызова public void put() до этого момента небыло?
Это сообщение отредактировал(а) GIK - 18.1.2006, 13:28 -------------------- Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!! Программирование - это не деятельнось! Программирование - это состояние души! Бог - самый крутой программист. |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
Если запускаешь run(), то выполнится метод run()... поток не создается.
Поток создает именно метод start(), создает, а потом как говорится в отдельном контексте (или псевдопаралельно) запускает метод run(). Так что простой запуск run() аналогичен простому методу (без параллельного выполнения). |
|||
|
||||
| GIK |
|
|||
![]() Добрый человек ![]() ![]() Профиль Группа: Участник Сообщений: 985 Регистрация: 3.6.2005 Где: я только не небыв ал Репутация: нет Всего: 14 |
А как тогда осуществляется остановка t.sleep(1000) ? Она ведь осуществляется? В смысле после запуска run. Это сообщение отредактировал(а) GIK - 18.1.2006, 14:24 -------------------- Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!! Программирование - это не деятельнось! Программирование - это состояние души! Бог - самый крутой программист. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Метод sleep() статический, и хотя ты можешь вызвать его от экземпляра, но это все равно эквивалентно Thread.sleep(). И тормозится, текущий поток. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| GIK |
|
|||
![]() Добрый человек ![]() ![]() Профиль Группа: Участник Сообщений: 985 Регистрация: 3.6.2005 Где: я только не небыв ал Репутация: нет Всего: 14 |
Понял. А как же остальные потоки, почему они не включаются? Мое предположение, что из-за того что run был запущен не через put(), и по этому возврата к главному потоку не было? Добавлено @ 14:53 В смысле сразу невключаются. -------------------- Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!! Программирование - это не деятельнось! Программирование - это состояние души! Бог - самый крутой программист. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
У тебя в конструкторе B(A a, String s) вначале вызывается просто метод run() и соответсвенно Thread.sleep() вызывается для потока main. Потом, создается новый поток и метод run() вызывается у него, и соответвенно Thread.sleep() действует уже для него. Поскольку у тебя потоки все таки создаются в итоге, то и метод t.join() срабатывает.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| GIK |
|
|||
![]() Добрый человек ![]() ![]() Профиль Группа: Участник Сообщений: 985 Регистрация: 3.6.2005 Где: я только не небыв ал Репутация: нет Всего: 14 |
Тут либо я чето недопонимаю, либо вопрос задал не правильно.
После запуска run и первой остановки t.sleep(1000) запуск put(); СРАЗУ не происходит, и вообще ничего СРАЗУ, после run () не происходит, в том числе возврат к созданию третьего экземпляра B b2 = new B();. Вот я и думаю, что возврат к остальным потокам (действиям), происходит только после вызова через t.start()? Т.е. только он имеет характеристики возврата к другим потокам (действиям), а метод t.join() вообще инициализируется только после третьего экземпляра B b2 = new B();. -------------------- Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!! Программирование - это не деятельнось! Программирование - это состояние души! Бог - самый крутой программист. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Программа работает так:
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| GIK |
|
|||
![]() Добрый человек ![]() ![]() Профиль Группа: Участник Сообщений: 985 Регистрация: 3.6.2005 Где: я только не небыв ал Репутация: нет Всего: 14 |
Ща не могу проверить, но по памяти вывод такой:
BlaBla BlaBla Potok GoOOOOOOOOOO1 Potok GoOOOOOOOOOO2 Potok GoOOOOOOOOOO3 Potok GoOOOOOOOOOO4 Potok GoOOOOOOOOOO5 А потом все остально неважное. Так вот, почему его не прерывают остальные потоки, как если бы его запустили через put(); ? -------------------- Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!! Программирование - это не деятельнось! Программирование - это состояние души! Бог - самый крутой программист. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
На самом деле вывод такой:
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |