![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
Есть метод с помощью которого можно получить значение переменой-true false. Нужно написать функцию, которая вызывает
другой метод после того как значение переменой стало true. Как это можно сделать? |
|||
|
||||
priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
Вывод: if checker is true this method is called P.S. В java нет функций. Это сообщение отредактировал(а) priam220 - 11.1.2011, 23:57 |
|||
|
||||
Asafj |
|
||||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
Это не совсем, что нужно
Я получаю из другого класса только значение переменной Это значение сначало false потом становится true И после того как оно поменялось надо взвать другой метод т.е
но если b = false метод не вызовится я пробовал что-то вроде этого но в многопоточной программе я думаю это не вариант:
|
||||
|
|||||
priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
||||
|
||||
lazycat |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 15.7.2007 Репутация: 1 Всего: 1 |
Думаю, что Вам надо нечто в таком роде:
|
|||
|
||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
значение меняется в другой части приложения
Добавлено через 3 минуты и 49 секунд lazycat, в этом случае если upd=false метод не вызовется |
|||
|
||||
priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
так ты будешь долго писать свой код, особенно в многопоточной программе. Свойство класса может меняться только из одного места, - из самого класса, с помощью метода-сеттера, и в твоем случае, он должен быть синхронизирован (либо свойство должно быть объявлено как volatile). Надеюсь, что, наконец, понял условие. Это сообщение отредактировал(а) priam220 - 12.1.2011, 01:09 |
|||
|
||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
А если доступен тоько get - метод из этого класса?
|
|||
|
||||
priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
если доступен только get, значит: 1. комуто было лень писать set 2. значение свойства не должно меняться. Если этот класс скомпилин (просто добавить нужный метод не можешь) и он не финальный, то ты его можешь расширить, дописав set в потомке. плохое решение. Это сообщение отредактировал(а) priam220 - 12.1.2011, 01:42 |
|||
|
||||
Temdegon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 11.10.2008 Где: Minsk Репутация: 7 Всего: 9 |
Объясни, ты это делаешь в своем коде? Или у тебя есть готовый класс, который ты изменить не можешь, и можешь только вызывать геттер?
|
|||
|
||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
Temdegon, да
|
|||
|
||||
priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
Надеюсь, я один не понял, что означало слово "да".
![]() |
|||
|
||||
Temdegon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 11.10.2008 Где: Minsk Репутация: 7 Всего: 9 |
Краткость конечно с.т., но я лично не понял, что значит "да" в этом контексте.
|
|||
|
||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
Ну собственно ответ на твой вопрос. Второй.
|
|||
|
||||
lazycat |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 15.7.2007 Репутация: 1 Всего: 1 |
Ошибаетесь, метод будет вызываться при каждом ИЗМЕНЕНИИ значении переменной, а при первом обращении к ней вызовется при любом значении. Правда с кодом я протупил (писал его практически засыпая) и написал чушь. Реально он должен выглядеть так:
|
|||
|
||||
techmax |
|
|||
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 5.9.2007 Где: Красноярск Репутация: 2 Всего: 2 |
посмотри может есть какой-нибудь листнер на изменение переменной.
или Напиши какой-нибудь класс для изменения этого свойства
|
|||
|
||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
Я не понимаю - пусть Upd примет значение. Метод е() выполнится или нет от ситуации.
Каким образом выполнение сюда вернется после изменения значения. Он должен ждать изменения с false на true. |
|||
|
||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
листнер на изменение переменной я думаю подошел бы
но где ж его взять? |
|||
|
||||
Kircul |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 20.2.2007 Репутация: 6 Всего: 7 |
Ну что значит где? Возможно некоторые ЯП поддерживают данные возможности на уровне языка, но не Java (философия не та). Если вам нужен слушатель то напишите этот код сами.
Собственно ничего сверхъестественного. Читаем тут. Это сообщение отредактировал(а) Kircul - 12.1.2011, 13:40 |
||||
|
|||||
jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
-------------------- Opinions are like assholes — everybody has one |
|||
|
||||
priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
lazycat, у тебя NPE выскочит.
исходя из условия нет этого метода в классе. Мне кажется ни листенеры ни наблюдатели тут не нужны. Человеку надо почитать что такое инкапсуляция и переписать свой код нормально. Это сообщение отредактировал(а) priam220 - 12.1.2011, 14:48 |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Если это свой код или чужой с исходниками - переписать, чтобы были сеттер и листенер.
Если исходников нет - только опрос в Thread'е, что будет с запаздыванием. |
|||
|
||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
опрос в треде - эт что значит?
|
|||
|
||||
priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
||||
|
||||
math64 |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
a) Сеттера нет, но есть исходник - рефакторинг "добавить сеттер" с установленным флажком "заменить обращения к переменной на вызов сеттера" b) Сеттер есть, но он не public, а protected, его можно переопределить в производном классе:
c) Сеттера нет или он private - опрос в Thread'e:
Это сообщение отредактировал(а) math64 - 13.1.2011, 09:06 |
||||||
|
|||||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
спасибо
А с вот это объясни:
|
|||
|
||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
А здесь что хуже использовать
или wihle(!a.getx()); |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Переменная terminate управляет завершением Thread. Как только terminated устанавливается в true, поток на очередном обороте завершается.
Если нужно ждать только один раз - можно while(!a.getX() && !terminate) { ... }. terminate лучше оставить, чтобы можно было завершить Thread и тогда, когда getX() никогда не станет true. PS: для булевых свойств геттер обычно называется isX(). |
|||
|
||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
А все таки когда terminate должен вызываться?
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Установи terminate = true; когда нить больше не нужна. Если она должна работать всегда, это делается перед при завершением программы.
|
|||
|
||||
Kircul |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 20.2.2007 Репутация: 6 Всего: 7 |
math64,
Я конечно не гуру, но мне кажется что прерывать поток/нить правильнее будет как в данном туторе. Не стоит изобретать велосипед. |
|||
|
||||
jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Ага. И раз уже заговорили о велосипедах, то прерывать такой поток перед выходом из приложения не обязательно. Можно просто запустить его как daemon:
-------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
А если здесь isX() =false несколько секунд насколько плохо использовать вместо потоков
while(!isX()); |
|||
|
||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
А если здесь isX() =false несколько секунд насколько плохо использовать вместо потоков
while(!isX()); |
|||
|
||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
А здесь вот конкретно для моего случая
Нужно сделать 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®; thread.start(); break; |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Thread дожен что-то еще делать кроме опроса isX() - (например, после выхода из цикла) иначе он бесполезен. Ну и вызови setDaemon(), как посоветовали, чтобы программы нормально завершалась, еслы isX() всегда возвращает true.
|
|||
|
||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
здесь thread должен ждать пока переменная не станет true и только затем должен быть break.
|
|||
|
||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
Вот здесь после thread.join() поток разве жив? |
|||
|
||||
Kircul |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 20.2.2007 Репутация: 6 Всего: 7 |
[offtopic]Asafj, прочитайте вы наконец хоть какую-нибудь книгу по Java![/offtopic]
|
|||
|
||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
А все таки - кто-нибудь в состоянии обьяснить- почему поток не завершается после выхода из цикла?
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Если основной поток ждёт завершения второго потока, ждущего isX() == false, зачем тебе второй поток? Опрашивай isX() в основном. Второй поток нужен только для того, чтобы освободить основной поток для какого-либо полезного дела.
|
|||
|
||||
Asafj |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 26.8.2010 Репутация: нет Всего: нет |
А как в основном опрашивать?:
while(!isX()); я думаю здесь не вариант А если while(!isX()) {Thread.sleep();} зависает |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |