Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: работа потоков  (Прочитано 28513 раз)
0 Пользователей и 1 Гость смотрят эту тему.
AlexeyxSD
Новенький

ru
Offline Offline

« : 16-01-2011 12:22 » 

  Нужно сделать break только тогда, когда isX() вернет true
  А сейчас после thread.start() - выход.
switch (key) {
case value:
   final Runnable r = new Runnable() {
       public void run() {
          while(!isX()) {
           try {
                      Thread.sleep(10000);
              } catch (InterruptedException ex) {
           }
          }
          }
   };
   Thread thread = new Thread(r);
   thread.start();

   break;
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 16-01-2011 17:53 » new

thread.join();
Записан
asdas
Интересующийся

ru
Offline Offline

« Ответ #2 : 18-01-2011 08:30 » 

А после thread.join() поток погиб?
То есть можно это многократно использовать7
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 18-01-2011 09:12 » 

join дожидается завершения потока. Для многократного исполнения задач нужно пользоваться другими механизмами. Я в многопоточности java не особо практиковался, так что наиболее общепринятых механизмов не скажу - нужно как-то организовывать очередь задач. Например, передавать в поток задачи с помощью очереди, как здесь: http://www.ibm.com/developerworks/ru/library/j-jtp0730/ (см. "Очереди действий") -- и использовать wait и notify/notifyAll для ожидания выполнения задачи внешними потоками.
Записан
asdas
Интересующийся

ru
Offline Offline

« Ответ #4 : 18-01-2011 15:42 » 

а вообще здесь как еще можно это сделать
подождать пока !isX()  не вернет true
Я думаю что-то вроде этого:
switch (key) {
case value:
while(!isX());
break;
Но по-моему решение фиговое
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 18-01-2011 17:58 » 

asdas, не понял, что это было в части switch, но while(!isX()); - это однозначно скверное решение, поскольку ядро CPU будет загружено полностью и совершенно бесполезно - крутить этот цикл вхолостую.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
asdas
Интересующийся

ru
Offline Offline

« Ответ #6 : 20-01-2011 15:46 » 

while(!isX()) {  try {
           Thread.sleep(1000);
       } catch (InterruptedException ex) {
       }
   }
Вот это может считаться говнокодом?
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 20-01-2011 17:43 » 

Смотря что ты хочешь сделать этим кодом.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 20-01-2011 18:12 » 

Если цель - дождаться момента, когда isX() начнёт возвращать true, то конечно. Поскольку сон на 1 секунду годится только для каких-нибудь background-потоков или демонов с временнЫм масштабом событий - минуты и более. А InterruptedException означает, что какой-то посторонний поток будет прерывать этот сон. Но если есть посторонний поток, который умеет в нужные моменты будить данный, то задача решается таким образом, что данный поток останавливается на объекте синхронизации и ждёт наступления события, а управляющий поток в нужный момент это событие генерирует - и не нужны никакие sleep и тем более исключительные ситуации.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
asdas
Интересующийся

ru
Offline Offline

« Ответ #9 : 20-01-2011 18:23 » 

Цель - дождаться момента, когда isX() начнёт возвращать true
При этом false длится всего несколько секунд
Записан
AlexeyxSD
Новенький

ru
Offline Offline

« Ответ #10 : 20-01-2011 20:48 » 

А если из класса доступен только метод возвращающий значение переменной
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 20-01-2011 21:04 » 

Цель - дождаться момента, когда isX() начнёт возвращать true
При этом false длится всего несколько секунд
asdas, нет, это не цель. Ведь должно происходить ещё что-то, влияющее на значение, возвращаемое isX? Если так - пока непонятно, для чего вообще городить огород с отдельным потоком. Какую [более общую] задачу пытаешься решить?


AlexeyxSD, вопрос непонятен. Объясни задачу целиком.
Записан
asdas
Интересующийся

ru
Offline Offline

« Ответ #12 : 20-01-2011 21:08 » 

В это время другой поток меняет значение isX()
И кроме этого метода ничего получить нельзя из того класса, который менят это значение
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 20-01-2011 21:16 » 

То есть, существует какой-то чужой класс, к которому никак не подступиться, кроме как периодически мониторить isX? Ну, тогда вроде решение нормальное (насколько оно таким может быть в подобных условиях).

Думаю, можно разве что сделать вещи более очевидными, назвав их своими именами: использовать таймер (Timer), а не поток. В случае большого числа одновременных задач это тем более предпочтительно.
Записан
asdas
Интересующийся

ru
Offline Offline

« Ответ #14 : 20-01-2011 21:17 » 

а таймер как использовать
приер плизз
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 20-01-2011 21:28 » 

Грубо, как-то так:
Код: (Java)
import java.util.Timer;
import java.util.TimerTask;

//...
TimerTask task = new TimerTask() {
    public void run() {
       if (isX()) notifyAll();
    }

Timer timer = new Timer();
timer.scheduleAtFixedRate(
    task,
    0,      //delay
    1000 // period
    );

task.wait(); // ждём бесконечно в основном потоке, пока не сработает проверка.
Записан
asdas
Интересующийся

ru
Offline Offline

« Ответ #16 : 21-01-2011 15:58 » 

А что значит timer.scheduleAtFixedRate
и можно немного поточнее - чтобы скомпилировалось
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 21-01-2011 17:24 » 

asdas, может ещё и сразу готовое решение дать?!
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
asdas
Интересующийся

ru
Offline Offline

« Ответ #18 : 21-01-2011 17:46 » 

Просто первый раз с этим столкнулся
здесь скобка то-где хотя бы быть должна?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 21-01-2011 19:00 » 

asdas, если речь про анонимный класс (или как он там называется в Java), то скобка между концом run и строкой с Timer timer.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 21-01-2011 22:01 » 

asdas, если речь про анонимный класс (или как он там называется в Java), то скобка между концом run и строкой с Timer timer.
Dimka, ну вот зачем, а? Улыбаюсь Такой получился бы нечаянный тест на понимание...
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 21-01-2011 22:35 » 

Вад, Dimka, не ну пацаны, ей бо...
чесслово и мне интересно, бо в java ни хрена несмыслю....
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines