Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Выйти из метода / 18 сообщений из 18, страница 1 из 1
18.03.2013, 23:20:41
    #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
19.03.2013, 09:21:40
    #38189025
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выйти из метода
oson,

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

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

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

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

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

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


Любая книга по Java. Раздел о многопоточном программировании. Модификатор volatile.
...
Рейтинг: 0 / 0
26.03.2013, 00:47:13
    #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
26.03.2013, 07:50:04
    #38198151
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выйти из метода
Зачем здесь Thread'ы? Может session-scoped бина достачно, раз уж спрмнг используется...
...
Рейтинг: 0 / 0
27.03.2013, 18:18:07
    #38201059
oson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выйти из метода
WGAЗачем здесь Thread'ы? Может session-scoped бина достачно, раз уж спрмнг используется...

Как тут можно использовать session bean?
...
Рейтинг: 0 / 0
27.03.2013, 18:43:22
    #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
04.04.2013, 17:50:57
    #38213392
oson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выйти из метода
Спасибо. Буду смотреть Future и @Asynchronous - не работал с этим.
Кстати @javax.ejb.Asynchronous - это будет работать в Spring контейнере?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Выйти из метода / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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