powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Выйти из метода
18 сообщений из 18, страница 1 из 1
Выйти из метода
    #38188838
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите плиз как решить задачу.
Запускается на Spring
Есть определенный метод

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public method1(List persons)
{
   for(Person person : persons)
  {
     try { Thread.sleep(10000); } 

      if(person.isWaitSalary())
      {
         person.sendSalary(); 
      }
  }
}


В интерфейсе выводится список person, и в каждой строке есть кнопка, по которой определенному человеку можно изменить статус -

Код: java
1.
person.setWaitSalary(false);



Таким образом когда этот цикл проходит 10000 человек, то должна быть возможность убрать з цикла некоторых person.
То есть уже в процессе запущенного цикла можно нажать для person789 кнопку и запрос
Код: java
1.
person.isWaitSalary() 

будет возвращать false.

Но по факту при нажатии кнопки person.setWaitSalary(false) цикл не прерывается, а доходит до конца, и только после окончания цикла статус того person, которому нажали кнопку, меняется на false - когда это уже естественно никому не нужно.

Как правильно решить такую задачу?
...
Рейтинг: 0 / 0
Выйти из метода
    #38189025
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oson,

я думаю, надо программировать.
...
Рейтинг: 0 / 0
Выйти из метода
    #38189049
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oson,

Метод работает в отдельном потоке?
...
Рейтинг: 0 / 0
Выйти из метода
    #38189164
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oson,

Не совсем понял задачу, но думаю вам стоит посмотреть в сторону модификатора volatile.
...
Рейтинг: 0 / 0
Выйти из метода
    #38189419
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну задача такая.
Работает метод в цикле, обрабатывает список, и надо иметь возможность влиять на эту обработку внешней кнопкой в веб интерфейсе.
Просто вставить внутрь метода какой то булевский флаг, который переводить в состояние false, и тогда метод должен остановиться, не получается. Реакция на нажатие этой кнопки происходит только после окончания ВСЕГО метода.
Чтобы репродюсить в медленном темпе и успевать нажать кнопку, я ставлю там Thread.sleep(10000). Но метод ждет каждые 10 секунд, затем продолжает работу, и не обращает внимание на нажатую кнопку. И только когда он полностью закончится, наконец происходит реакция на кнопку, булевская переменная переключается в false, но это естественно уже ни на что не влияет, так как метод и так закончился. Запущено в контейнере Spring.
Я предполагаю что подход в корне неверный :)
Как то решается такая задача?
...
Рейтинг: 0 / 0
Выйти из метода
    #38189439
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oson,
Вы говорите про "нажатую кнопку", а в коде person.isWaitSalary();
Между "нажатой кнопкой" и person.isWaitSalary() просто пропасть кода. Но при этом вы хотите чтобы вам подсказали где именно в том коде у вас ошибка?
Где гарантии что ваша кнопка вообще как-то свяазана с этим isWaitSalary() конкретного объекта person?
...
Рейтинг: 0 / 0
Выйти из метода
    #38189451
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты жжошь.

У тебя выполнение цикла и нажатие кнопки в одном потоке происходит? Естественно оно будет выполняться последовательно.
Тебе надо вынести цикл в отдельный поток, и как то синхронизировать свой лист персонов.
...
Рейтинг: 0 / 0
Выйти из метода
    #38197463
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я понимаю, что таким прямым способом я н остановлю цикл. Запускается какой-то процесс внутри Spring контейнера, и тут я должен каким-то способом запустить другой процесс нажатием кнопки, чтобы он повлиял на первый.
Возможно ли вообще такое? Мне кажется сделать такой стабильный код вообще невозможно, потому что тут надо влезать во внутреннюю реализацию Spring контейнера. А может быть этот первый процесс вообще проходит без прерываний и я из второго процесса не смогу никак на него повлиять. Правильно я понимаю, или все же есть какой то способ?
...
Рейтинг: 0 / 0
Выйти из метода
    #38197477
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonЗапускается какой-то процесс внутри Spring контейнера, и тут я должен каким-то способом запустить другой процесс нажатием кнопки, чтобы он повлиял на первый.
Возможно ли вообще такое?
нет, на данном уровне научного развития это неразрешимая задача.

oson Мне кажется сделать такой стабильный код вообще невозможно, потому что тут надо влезать во внутреннюю реализацию Spring
здесь спринг вообще сбоку. задача на многопоточное программирование. правда не понятна ее постановка - тараканьи бега какие-то.
...
Рейтинг: 0 / 0
Выйти из метода
    #38197478
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonДа я понимаю, что таким прямым способом я н остановлю цикл. Запускается какой-то процесс внутри Spring контейнера, и тут я должен каким-то способом запустить другой процесс нажатием кнопки, чтобы он повлиял на первый.
Возможно ли вообще такое? Мне кажется сделать такой стабильный код вообще невозможно, потому что тут надо влезать во внутреннюю реализацию Spring контейнера. А может быть этот первый процесс вообще проходит без прерываний и я из второго процесса не смогу никак на него повлиять. Правильно я понимаю, или все же есть какой то способ?
"внутренняя реализация Spring контейнера" к теме вообще отношения не имеет.
Нужно разбраться в некоторых вопросах
- Что такое Thread?
- Как один Thread может взаимодействовать с другим?
- Какой код выполняется в потоках, создаваемых JEE контейнером и как самому создавать потоки в рамках JEE приложения?
- Что такое очередь?
После того как на эти вопросы удаться дать какой-то внятный ответ, можно приступить к вопросу, как это всё применить к вашей задаче.

Какой-то из 4х вопросов выше вызывает затруднение, или это всё давно знакомо?
...
Рейтинг: 0 / 0
Выйти из метода
    #38198032
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовал класс Thread только когда-то, когда надо было чтобы кнопка в Swing приложении была доступна при интенсивно перерисовывающейся картинке. Про взаимодействие потоков тема как-то прошла мимо. Что почитать?
...
Рейтинг: 0 / 0
Выйти из метода
    #38198048
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonИспользовал класс Thread только когда-то
Дело не в самом классе Thread. А в принципиальном понимании что такое "поток".
...
Рейтинг: 0 / 0
Выйти из метода
    #38198050
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oson,


Любая книга по Java. Раздел о многопоточном программировании. Модификатор volatile.
...
Рейтинг: 0 / 0
Выйти из метода
    #38198068
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
class MyServlet extends HttpServlet{
	static SendSalaryTask task;
	static class SendSalaryTask extends Thread{
		public volatile interrupted = false;
		public void run(){
		   for(Person person : persons)
		  {
			  if(interrupted) return;
			  if(person.isWaitSalary())
			  {
				 person.sendSalary(); 
			  }
		  }			
		}
	}
	
	static synchronized runTask(){
			if(task == null){
				task = new SendSalaryTask();
				task.start();
				return true;
			}else{
				return false;
			}
	}
	
	static synchronized stopTask(){
		if(task!=null){
			task.interrupted = true;
		}
	}
	
	public service(HttpRequest req,HttpResponse resp){
		if(req.hasParameter("runTask")){
			if(runTask()){
				resp.print("launched task")
			}else{
				resp.print("task is already running")
			}
		}else if(req.hasParameter("stop")){
			stopTask();
		}else{
			resp.print("invalid params");
		}
	}
}
...
Рейтинг: 0 / 0
Выйти из метода
    #38198151
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
Зачем здесь Thread'ы? Может session-scoped бина достачно, раз уж спрмнг используется...
...
Рейтинг: 0 / 0
Выйти из метода
    #38201059
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WGAЗачем здесь Thread'ы? Может session-scoped бина достачно, раз уж спрмнг используется...

Как тут можно использовать session bean?
...
Рейтинг: 0 / 0
Выйти из метода
    #38201110
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonКак тут можно использовать session bean?
Типа такого можно попробовать.
http://stackoverflow.com/questions/2900086/how-can-i-return-a-future-object-with-spring-without-writing-concurrency-logic
Вместо AsyncResult использовать свой Future, который можно прерывать Future.cancel().
А в цикле проверять Future.isCanceled();
Соответственно, при старте задачи, Future сохранить в session scoped bean.
А при нажатии кнопки отмены у Future вызывать Cancel.

Единственное что у вас там по каждой отдельной Person флаг. Нужно, значит, хранить что-ти типа LinkedHashMap<Future<Person>>
...
Рейтинг: 0 / 0
Выйти из метода
    #38213392
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Буду смотреть Future и @Asynchronous - не работал с этим.
Кстати @javax.ejb.Asynchronous - это будет работать в Spring контейнере?
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Выйти из метода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]