Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки, Многопоточное программирование 
:(
    Опции темы
GIK
  Дата 13.1.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: нет
Всего: 14



Всем привет.
В данный момент разбираю потоки, и у меня возникло пара вопросов.
1) Почему обращение Thread.sleep(500); происходит именно так, а не t.sleep(500);, что для меня логичней было бы, т.е. почему обращаются именно к классу Thread, а не к его экземпляру.

2) Еще мне не понятна конструкция Thread.sleep(500); тем что она может вызвать исключение типа InterruptedException , ЕСЛИ бы кокой нибуть поток прервал его ожидание. Как я понял потоком который прерывает ожидание, может является ГЛАВНЫЙ поток, НО в свою очередь потоки используют процессор ВМЕСТЕ.
Тут то я и запутался окончательно.

Вот код:
Код

class NewThread implements Runnable {
  Thread t;
  
  NewThread() {
  //Создать новый второй поток.
 t = Thread (this, "Demo Thread");
 System.out.println("Дочерний поток: " + t);  
 t.start();   //Стартовть поток  
}
 //Это точка входа во второй поток  
  public void run() {
   try {
    for(int i=0; i<5; i++) {
     System.out.println("Дочерний поток: " + i);
     Thread.sleep(500);     //Вызывается сам Thread, а не его экземпляр t ???
   }
  } catch (InterruptedException e) {
    System.out.println("Прерывание дочернего потока.");
   }
} 
     class ThreadDemo {   
 public static void main(String args[]) {
  new NewThread(); //Создать поток
   
   try {
    for(int i=0; i<5; i++) {
     System.out.println("Главный поток: " + i);
     Thread.sleep(1000);
   }
  } catch (InterruptedException e) {
    System.out.println("Прерывание главного потока"); 
    } 
  System.out.println("Завершение главного потока");   
 }
} 



--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
redrick
Дата 13.1.2006, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 3
Всего: 5



Цитата(GIK @ 13.1.2006, 17:47 Найти цитируемый пост)

1) Почему обращение Thread.sleep(500); происходит именно так, а не t.sleep(500);, что для меня логичней было бы, т.е. почему обращаются именно к классу Thread, а не к его экземпляру.

Код

sleep

public static void sleep(long millis)
                  throws InterruptedException

    Causes the [B]currently executing[/B] thread to sleep (temporarily cease execution) for the specified number of milliseconds. 


как можно попросить прекратить выполнение тред кооторый не выполняется ? Соответственно если бы он был у экземпляра, то его можно было бы вызвать когда поток не выполняется - и тогда не понятно что делать.

Цитата(GIK @ 13.1.2006, 17:47 Найти цитируемый пост)

2) Еще мне не понятна конструкция Thread.sleep(500); тем что она может вызвать исключение типа InterruptedException , ЕСЛИ бы кокой нибуть поток прервал его ожидание. Как я понял потоком который прерывает ожидание, может является ГЛАВНЫЙ поток

Код

public class InterruptedException
extends Exception

Thrown when a thread is waiting, sleeping, or otherwise paused for a long time and another thread interrupts it using the interrupt method in class Thread. 

- действительно ГЛАВНЫЙ (надеюсь ты под ним подразумеваешь тот который выполняется ссейчас)

Цитата(GIK @ 13.1.2006, 17:47 Найти цитируемый пост)

НО в свою очередь потоки используют процессор ВМЕСТЕ.

это чисто такое, общее выражение. На самом деле понятно, что если у тебя в машине 1 процессор, то в каждый момент времени выполняется код 1го треда - того самом currently executing
Выражение "используют вместе" - означает что шедуллер попеременно ставит то одного то другого и снаружи выглядит как буддто они вместе потихоньку работают.


Это сообщение отредактировал(а) redrick - 13.1.2006, 19:45


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
COVD
Дата 13.1.2006, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Thread.sleep(500); то же самое, что и Thread.currentThread().sleep(500), т.е. на самом деле текущий поток тормозится. А прервать его может любой другой поток, имеющий ссылку на текущий.

sleep() надо использовать если вы не предполагаете его прерывать. Если же вы хотите поток "разбудить" из другого потока, то надо использовать wait() - notify().
PM MAIL   Вверх
GIK
Дата 14.1.2006, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: нет
Всего: 14



Цитата

как можно попросить прекратить выполнение тред кооторый не выполняется ? Соответственно если бы он был у экземпляра, то его можно было бы вызвать когда поток не выполняется - и тогда не понятно что делать.

Т.е. Thread - это всегда поток который выполняется ?
Цитата

действительно ГЛАВНЫЙ (надеюсь ты под ним подразумеваешь тот который выполняется ссейчас)
Главный поток-поток который начинается с вызова метода main.
Цитата

это чисто такое, общее выражение. На самом деле понятно, что если у тебя в машине 1 процессор, то в каждый момент времени выполняется код 1го треда - того самом currently executing
Выражение "используют вместе" - означает что шедуллер попеременно ставит то одного то другого и снаружи выглядит как буддто они вместе потихоньку работают.

Понял.

Цитата

Thread.sleep(500); то же самое, что и Thread.currentThread().sleep(500), т.е. на самом деле текущий поток тормозится. А прервать его может любой другой поток, имеющий ссылку на текущий.

А как эта ссылка может реализоваться, именно в данном примере, и именно на дочерний поток?




--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
LSD
Дата 14.1.2006, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(GIK @ 14.1.2006, 10:38 Найти цитируемый пост)
Т.е. Thread - это всегда поток который выполняется ?

Не совсем. Thread - это класс, а Thread.sleep(500) - это вызов статического метода у этого класса. Просто он вызывает засыпание для того потока из которого был вызван.

Цитата(GIK @ 14.1.2006, 10:38 Найти цитируемый пост)
А как эта ссылка может реализоваться, именно в данном примере, и именно на дочерний поток?

Так:
Код
public class ThreadTest extends Thread
{
  public void run()
  {
    try
    {
      Thread.sleep(60 * 60 * 1000);
    }
    catch(InterruptedException ex)
    {
      System.out.println("Thread was iterrupted: " + ex);
    }
  }
  
  public static void main(String[] args)
  {
    ThreadTest threadTest = new ThreadTest();
    threadTest.start();
    try
    {
      Thread.sleep(1000);//Ждем пока ThreadTest запустится
    }
    catch(InterruptedException ex)
    {}
    System.out.println("Trying to interrupt ThreadTest");
    threadTest.interrupt();
    System.out.println("Exiting");
  }
}



--------------------
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.
PM MAIL WWW   Вверх
GIK
Дата 18.1.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: нет
Всего: 14



Извяюсь что поднимаю старый вопрос, просто возникли непонятки.
Почемуто при запуске потока в экземпляре b (B b = new B(a,"super");), сразу через run(), реализуется только один поток (действие), т.е. другие, пока незакончится этот, просто бездействуют?
И еще странно что t.sleep(1000); вроде как работает, но вызова public void put() до этого момента небыло?
Код

class B extends A implements Runnable { 
 A a;     
 Thread t; 
 B (A a, String s){
  this.a=a;
  a.cul(); //Запуск через экземпляр "а" (класс запускает свой метод)
  cul();  //Запуск метода суперкласса, в ЭТОМ же экземпляре (b2)

  run(); //Запуск самого run, не через put()!!!
         // И это уже не поток ???????????????
// Интересно, распознает ли он t.sleep(1000) ??????????
  put(); // Запуск через создание потока
 }
  B(){
  put(); //Можно запустить и без синхронизатора
  }
   public void put(){
  t=new Thread(this, "bla1"); 
  t.start();    
   } 
   public void run() {
  try{
   for (int i=5; i>0; i--)
  {
   System.out.println("Potok GoOOOOOOOOOO"+i);
   t.sleep(1000);
  } 
     } catch(InterruptedException e){System.out.println("Iskluchenie eeeeeee");}; 
 }    
} 
   class Potoki2 {
 public static void main(String args[]){

  Thread t1=Thread.currentThread(); 

   A a = new A();
   B b = new B(a,"super");
   B b2 = new B();

 try{
  b2.t.join(); //Ожидание запущенного через put() потока в экземпляре "b2" 
  b.t.join(); // Ожидание запущенного через put() потока в экземпляре "b" 
  
 } catch(InterruptedException e) {System.out.println("Glavni potok zavershon");}
 }
}


Это сообщение отредактировал(а) GIK - 18.1.2006, 13:28


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
powerOn
Дата 18.1.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Если запускаешь run(), то выполнится метод run()... поток не создается.
Поток создает именно метод start(), создает, а потом как говорится в отдельном контексте (или псевдопаралельно) запускает метод run(). Так что простой запуск run() аналогичен простому методу (без параллельного выполнения).


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
GIK
Дата 18.1.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: нет
Всего: 14



Цитата

Если запускаешь run(), то выполнится метод run()... поток не создается.
Поток создает именно метод start(), создает, а потом как говорится в отдельном контексте (или псевдопаралельно) запускает метод run(). Так что простой запуск run() аналогичен простому методу (без параллельного выполнения).

А как тогда осуществляется остановка t.sleep(1000) ?
Она ведь осуществляется?
В смысле после запуска run.

Это сообщение отредактировал(а) GIK - 18.1.2006, 14:24


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
LSD
Дата 18.1.2006, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(GIK @ 18.1.2006, 14:23 Найти цитируемый пост)
А как тогда осуществляется остановка t.sleep(1000) ?

Метод 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.
PM MAIL WWW   Вверх
GIK
Дата 18.1.2006, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: нет
Всего: 14



Цитата

Метод sleep() статический, и хотя ты можешь вызвать его от экземпляра, но это все равно эквивалентно Thread.sleep(). И тормозится, текущий поток
.
Понял.
А как же остальные потоки, почему они не включаются?
Мое предположение, что из-за того что run был запущен не через put(), и по этому возврата к главному потоку не было?
Добавлено @ 14:53
В смысле сразу невключаются.


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
LSD
Дата 18.1.2006, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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.
PM MAIL WWW   Вверх
GIK
Дата 18.1.2006, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: нет
Всего: 14



Тут либо я чето недопонимаю, либо вопрос задал не правильно.
После запуска run и первой остановки t.sleep(1000) запуск put(); СРАЗУ не происходит, и вообще ничего СРАЗУ, после run () не происходит, в том числе возврат к созданию третьего экземпляра B b2 = new B();.
Вот я и думаю, что возврат к остальным потокам (действиям), происходит только после вызова через
t.start()? Т.е. только он имеет характеристики возврата к другим потокам (действиям), а метод
t.join() вообще инициализируется только после третьего экземпляра B b2 = new B();.






--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
LSD
Дата 18.1.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Программа работает так:
  • создается объект A (тут ничего интерестного)
  • вызывается конструктор объекта B
  • в конструкторе вызывается метод run(), в котором проходимся с секундной задержкой от 5 до 1
  • вызываем метод put(), который создат новый поток и запускает его
  • возвращаемся из конструктора B
  • на данные момент работают 2 потока main и bla1
  • присваиваем ссылку на только что созданный объект, переменной b
  • аналогично для b2, но там не вызываем метод run()
  • на данные момент работают 2 потока main и два bla1
  • ждем завершения второго потока b2.t.join()
  • ждем завершения первго потока b.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.
PM MAIL WWW   Вверх
GIK
Дата 18.1.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: нет
Всего: 14



Ща не могу проверить, но по памяти вывод такой:
BlaBla
BlaBla
Potok GoOOOOOOOOOO1
Potok GoOOOOOOOOOO2
Potok GoOOOOOOOOOO3
Potok GoOOOOOOOOOO4
Potok GoOOOOOOOOOO5
А потом все остально неважное.

Так вот, почему его не прерывают остальные потоки, как если бы его запустили через put(); ?


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
LSD
Дата 18.1.2006, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



На самом деле вывод такой:
Код
col()
col()
Potok GoOOOOOOOOOO5
Potok GoOOOOOOOOOO4
Potok GoOOOOOOOOOO3
Potok GoOOOOOOOOOO2
Potok GoOOOOOOOOOO1
Potok GoOOOOOOOOOO5
Potok GoOOOOOOOOOO5
Potok GoOOOOOOOOOO4
Potok GoOOOOOOOOOO4
Potok GoOOOOOOOOOO3
Potok GoOOOOOOOOOO3
Potok GoOOOOOOOOOO2
Potok GoOOOOOOOOOO2
Potok GoOOOOOOOOOO1
Potok GoOOOOOOOOOO1



--------------------
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.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.