AlexeyxSD
Новенький
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;
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #1 : 16-01-2011 17:53 » |
|
thread.join();
|
|
|
Записан
|
|
|
|
asdas
Интересующийся
Offline
|
|
« Ответ #2 : 18-01-2011 08:30 » |
|
А после thread.join() поток погиб? То есть можно это многократно использовать7
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #3 : 18-01-2011 09:12 » |
|
join дожидается завершения потока. Для многократного исполнения задач нужно пользоваться другими механизмами. Я в многопоточности java не особо практиковался, так что наиболее общепринятых механизмов не скажу - нужно как-то организовывать очередь задач. Например, передавать в поток задачи с помощью очереди, как здесь: http://www.ibm.com/developerworks/ru/library/j-jtp0730/ (см. "Очереди действий") -- и использовать wait и notify/notifyAll для ожидания выполнения задачи внешними потоками.
|
|
|
Записан
|
|
|
|
asdas
Интересующийся
Offline
|
|
« Ответ #4 : 18-01-2011 15:42 » |
|
а вообще здесь как еще можно это сделать подождать пока !isX() не вернет true Я думаю что-то вроде этого: switch (key) { case value: while(!isX()); break; Но по-моему решение фиговое
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #5 : 18-01-2011 17:58 » |
|
asdas, не понял, что это было в части switch, но while(!isX()); - это однозначно скверное решение, поскольку ядро CPU будет загружено полностью и совершенно бесполезно - крутить этот цикл вхолостую.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
asdas
Интересующийся
Offline
|
|
« Ответ #6 : 20-01-2011 15:46 » |
|
while(!isX()) { try { Thread.sleep(1000); } catch (InterruptedException ex) { } } Вот это может считаться говнокодом?
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #7 : 20-01-2011 17:43 » |
|
Смотря что ты хочешь сделать этим кодом.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #8 : 20-01-2011 18:12 » |
|
Если цель - дождаться момента, когда isX() начнёт возвращать true, то конечно. Поскольку сон на 1 секунду годится только для каких-нибудь background-потоков или демонов с временнЫм масштабом событий - минуты и более. А InterruptedException означает, что какой-то посторонний поток будет прерывать этот сон. Но если есть посторонний поток, который умеет в нужные моменты будить данный, то задача решается таким образом, что данный поток останавливается на объекте синхронизации и ждёт наступления события, а управляющий поток в нужный момент это событие генерирует - и не нужны никакие sleep и тем более исключительные ситуации.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
asdas
Интересующийся
Offline
|
|
« Ответ #9 : 20-01-2011 18:23 » |
|
Цель - дождаться момента, когда isX() начнёт возвращать true При этом false длится всего несколько секунд
|
|
|
Записан
|
|
|
|
AlexeyxSD
Новенький
Offline
|
|
« Ответ #10 : 20-01-2011 20:48 » |
|
А если из класса доступен только метод возвращающий значение переменной
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #11 : 20-01-2011 21:04 » |
|
Цель - дождаться момента, когда isX() начнёт возвращать true При этом false длится всего несколько секунд
asdas, нет, это не цель. Ведь должно происходить ещё что-то, влияющее на значение, возвращаемое isX? Если так - пока непонятно, для чего вообще городить огород с отдельным потоком. Какую [более общую] задачу пытаешься решить? AlexeyxSD, вопрос непонятен. Объясни задачу целиком.
|
|
|
Записан
|
|
|
|
asdas
Интересующийся
Offline
|
|
« Ответ #12 : 20-01-2011 21:08 » |
|
В это время другой поток меняет значение isX() И кроме этого метода ничего получить нельзя из того класса, который менят это значение
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #13 : 20-01-2011 21:16 » |
|
То есть, существует какой-то чужой класс, к которому никак не подступиться, кроме как периодически мониторить isX? Ну, тогда вроде решение нормальное (насколько оно таким может быть в подобных условиях).
Думаю, можно разве что сделать вещи более очевидными, назвав их своими именами: использовать таймер (Timer), а не поток. В случае большого числа одновременных задач это тем более предпочтительно.
|
|
|
Записан
|
|
|
|
asdas
Интересующийся
Offline
|
|
« Ответ #14 : 20-01-2011 21:17 » |
|
а таймер как использовать приер плизз
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #15 : 20-01-2011 21:28 » |
|
Грубо, как-то так: 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
Интересующийся
Offline
|
|
« Ответ #16 : 21-01-2011 15:58 » |
|
А что значит timer.scheduleAtFixedRate и можно немного поточнее - чтобы скомпилировалось
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #17 : 21-01-2011 17:24 » |
|
asdas, может ещё и сразу готовое решение дать?!
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
asdas
Интересующийся
Offline
|
|
« Ответ #18 : 21-01-2011 17:46 » |
|
Просто первый раз с этим столкнулся здесь скобка то-где хотя бы быть должна?
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #19 : 21-01-2011 19:00 » |
|
asdas, если речь про анонимный класс (или как он там называется в Java), то скобка между концом run и строкой с Timer timer.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Вад
|
|
« Ответ #20 : 21-01-2011 22:01 » |
|
asdas, если речь про анонимный класс (или как он там называется в Java), то скобка между концом run и строкой с Timer timer.
Dimka, ну вот зачем, а? Такой получился бы нечаянный тест на понимание...
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #21 : 21-01-2011 22:35 » |
|
Вад, Dimka, не ну пацаны, ей бо... чесслово и мне интересно, бо в java ни хрена несмыслю....
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
|