Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Получание значения переменой |
Автор: Asafj 11.1.2011, 22:59 |
Есть метод с помощью которого можно получить значение переменой-true false. Нужно написать функцию, которая вызывает другой метод после того как значение переменой стало true. Как это можно сделать? |
Автор: priam220 11.1.2011, 23:53 | ||
Вывод: if checker is true this method is called P.S. В java нет функций. |
Автор: Asafj 12.1.2011, 00:08 | ||||
Это не совсем, что нужно Я получаю из другого класса только значение переменной Это значение сначало false потом становится true И после того как оно поменялось надо взвать другой метод т.е
но если b = false метод не вызовится я пробовал что-то вроде этого но в многопоточной программе я думаю это не вариант:
|
Автор: lazycat 12.1.2011, 00:22 | ||
Думаю, что Вам надо нечто в таком роде:
|
Автор: Asafj 12.1.2011, 00:23 |
значение меняется в другой части приложения Добавлено через 3 минуты и 49 секунд lazycat, в этом случае если upd=false метод не вызовется |
Автор: priam220 12.1.2011, 01:04 |
так ты будешь долго писать свой код, особенно в многопоточной программе. Свойство класса может меняться только из одного места, - из самого класса, с помощью метода-сеттера, и в твоем случае, он должен быть синхронизирован (либо свойство должно быть объявлено как volatile). Надеюсь, что, наконец, понял условие. |
Автор: Asafj 12.1.2011, 01:15 |
А если доступен тоько get - метод из этого класса? |
Автор: priam220 12.1.2011, 01:25 |
если доступен только get, значит: 1. комуто было лень писать set 2. значение свойства не должно меняться. Если этот класс скомпилин (просто добавить нужный метод не можешь) и он не финальный, то ты его можешь расширить, дописав set в потомке. плохое решение. |
Автор: Temdegon 12.1.2011, 01:26 |
Объясни, ты это делаешь в своем коде? Или у тебя есть готовый класс, который ты изменить не можешь, и можешь только вызывать геттер? |
Автор: Asafj 12.1.2011, 01:29 |
Temdegon, да |
Автор: priam220 12.1.2011, 01:49 |
Надеюсь, я один не понял, что означало слово "да". ![]() |
Автор: Temdegon 12.1.2011, 01:52 |
Краткость конечно с.т., но я лично не понял, что значит "да" в этом контексте. |
Автор: Asafj 12.1.2011, 02:03 |
Ну собственно ответ на твой вопрос. Второй. |
Автор: lazycat 12.1.2011, 08:33 | ||
Ошибаетесь, метод будет вызываться при каждом ИЗМЕНЕНИИ значении переменной, а при первом обращении к ней вызовется при любом значении. Правда с кодом я протупил (писал его практически засыпая) и написал чушь. Реально он должен выглядеть так:
|
Автор: techmax 12.1.2011, 08:58 | ||
посмотри может есть какой-нибудь листнер на изменение переменной. или Напиши какой-нибудь класс для изменения этого свойства
|
Автор: Asafj 12.1.2011, 11:13 |
Я не понимаю - пусть Upd примет значение. Метод е() выполнится или нет от ситуации. Каким образом выполнение сюда вернется после изменения значения. Он должен ждать изменения с false на true. |
Автор: Asafj 12.1.2011, 13:14 |
листнер на изменение переменной я думаю подошел бы но где ж его взять? |
Автор: Kircul 12.1.2011, 13:37 | ||||
Ну что значит где? Возможно некоторые ЯП поддерживают данные возможности на уровне языка, но не Java (философия не та). Если вам нужен слушатель то напишите этот код сами.
Собственно ничего сверхъестественного. Читаем http://goo.gl/lkbpM. |
Автор: jk1 12.1.2011, 14:10 | ||
Или используйте http://download.oracle.com/javase/tutorial/javabeans/properties/bound.html |
Автор: priam220 12.1.2011, 14:18 | ||
lazycat, у тебя NPE выскочит.
исходя из условия нет этого метода в классе. Мне кажется ни листенеры ни наблюдатели тут не нужны. Человеку надо почитать что такое инкапсуляция и переписать свой код нормально. |
Автор: math64 12.1.2011, 16:47 |
Если это свой код или чужой с исходниками - переписать, чтобы были сеттер и листенер. Если исходников нет - только опрос в Thread'е, что будет с запаздыванием. |
Автор: Asafj 12.1.2011, 19:26 |
опрос в треде - эт что значит? |
Автор: priam220 12.1.2011, 20:09 |
это то, что ты пытался с потоком навоять. |
Автор: math64 13.1.2011, 08:53 | ||||||
a) Сеттера нет, но есть исходник - рефакторинг "добавить сеттер" с установленным флажком "заменить обращения к переменной на вызов сеттера" b) Сеттер есть, но он не public, а protected, его можно переопределить в производном классе:
c) Сеттера нет или он private - опрос в Thread'e:
|
Автор: Asafj 13.1.2011, 11:20 | ||
спасибо А с вот это объясни:
|
Автор: Asafj 13.1.2011, 12:58 | ||
А здесь что хуже использовать
или wihle(!a.getx()); |
Автор: math64 13.1.2011, 14:28 |
Переменная terminate управляет завершением Thread. Как только terminated устанавливается в true, поток на очередном обороте завершается. Если нужно ждать только один раз - можно while(!a.getX() && !terminate) { ... }. terminate лучше оставить, чтобы можно было завершить Thread и тогда, когда getX() никогда не станет true. PS: для булевых свойств геттер обычно называется isX(). |
Автор: Asafj 13.1.2011, 20:52 |
А все таки когда terminate должен вызываться? |
Автор: math64 14.1.2011, 09:24 |
Установи terminate = true; когда нить больше не нужна. Если она должна работать всегда, это делается перед при завершением программы. |
Автор: Kircul 14.1.2011, 12:21 |
math64, Я конечно не гуру, но мне кажется что прерывать поток/нить правильнее будет как в данном http://goo.gl/EoITK. Не стоит изобретать велосипед. |
Автор: jk1 14.1.2011, 13:37 | ||||
Ага. И раз уже заговорили о велосипедах, то прерывать такой поток перед выходом из приложения не обязательно. Можно просто запустить его как daemon:
|
Автор: Asafj 14.1.2011, 21:30 |
А если здесь isX() =false несколько секунд насколько плохо использовать вместо потоков while(!isX()); |
Автор: Asafj 15.1.2011, 12:13 |
А если здесь isX() =false несколько секунд насколько плохо использовать вместо потоков while(!isX()); |
Автор: Asafj 16.1.2011, 15:11 |
А здесь вот конкретно для моего случая Нужно сделать 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 17.1.2011, 16:03 |
Thread дожен что-то еще делать кроме опроса isX() - (например, после выхода из цикла) иначе он бесполезен. Ну и вызови setDaemon(), как посоветовали, чтобы программы нормально завершалась, еслы isX() всегда возвращает true. |
Автор: Asafj 17.1.2011, 23:10 |
здесь thread должен ждать пока переменная не станет true и только затем должен быть break. |
Автор: Asafj 18.1.2011, 11:23 | ||
Вот здесь после thread.join() поток разве жив? |
Автор: Kircul 18.1.2011, 12:00 |
[offtopic]Asafj, прочитайте вы наконец хоть какую-нибудь книгу по Java![/offtopic] |
Автор: Asafj 18.1.2011, 12:42 |
А все таки - кто-нибудь в состоянии обьяснить- почему поток не завершается после выхода из цикла? |
Автор: math64 18.1.2011, 14:15 |
Если основной поток ждёт завершения второго потока, ждущего isX() == false, зачем тебе второй поток? Опрашивай isX() в основном. Второй поток нужен только для того, чтобы освободить основной поток для какого-либо полезного дела. |
Автор: Asafj 18.1.2011, 14:52 |
А как в основном опрашивать?: while(!isX()); я думаю здесь не вариант А если while(!isX()) {Thread.sleep();} зависает |