Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2018, 12:08   #1
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию Генерация событий

Есть объект A. При определенных условиях, он должен генерировать событие.
Объект B, должен реагировать на это событие.
Как это реализовать? Объекты находятся в разных потоках.
SAMOUCHKA вне форума Ответить с цитированием
Старый 15.09.2018, 12:29   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

гугл - java inter thread communication
гугл - java ipc
и выбираете один из кучи способов
p51x на форуме Ответить с цитированием
Старый 15.09.2018, 21:48   #3
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Раньше просто обрабатывал какие то стандартные события, нажатие кнопки и тому подобное, свои события создавать не приходилось.
Оказывается, это архи-сложная и непонятная тема. читал смотрел, но особо ни чего не понял. даже если все выполняется в одном потоке. Вот тут, например https://youtu.be/ltCysJBcH-4 для чего наследовать EventObject и EventListener? без этого все точно также работает.

В Qt все просто: объявил сигнал, реализовал слот, сконнектил и все! хоть два разных объекта, хоть в разных потоках.

Вот код подобный из видео, EventObject и EventListener, я закомментировал.
Код:
package test_listener;

import java.util.EventObject;

// Класс события
public class MyEvent// extends EventObject
{
	private static int static_id = 0;
	
	private int id = 0;

	public MyEvent(Object ob) 
	{
		//super(ob);
		
		id = static_id;
		static_id++;
	}
	
	public int getId() {return id;}

}
Код:
package test_listener;

import java.util.EventListener;

// Интерфейс слушатель событий
public interface MyEventListener// extends EventListener
{
	void processEvent(MyEvent event);
}
Код:
package test_listener;

import java.util.LinkedList;
import java.util.List;

public class Test 
{
	private List<MyEventListener> event_listeners = new LinkedList<>();
	
	// Добавляет слушателя событий
	public void addEventListener(MyEventListener listener)
	{
		event_listeners.add(listener);
	}
	
	// Уведомляет всех слушателей, о наступлении события
	public void notifyEventListeners(MyEvent event)
	{
		for(MyEventListener listener : event_listeners)
		{
			listener.processEvent(event);
		}
	}

	public static void main(String[] args)
	{
		System.out.println("TestEvent");
		
		Test test = new Test();
		
		test.addEventListener(new MyEventListener()
				{

					@Override
					public void processEvent(MyEvent event) 
					{
						System.out.println("event id:" + event.getId());
					}
			
				});
		
		test.notifyEventListeners(new MyEvent(test));
		test.notifyEventListeners(new MyEvent(test));
	}
}
Мне непонятен смысл всего этого. две последние строчки: объект test сам генерирует событие и сам его обрабатывает.
И для чего все таки наследуются EventObject и EventListener?

Последний раз редактировалось SAMOUCHKA; 15.09.2018 в 22:08.
SAMOUCHKA вне форума Ответить с цитированием
Старый 15.09.2018, 21:54   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну в Джаве нет стандартной системы событий, но самое простое это ж просто передать callback и вызвать когда надо.

В Java 8 есть всякие удобства типа лямбд и готовых интерфейсов для этого. https://docs.oracle.com/javase/8/doc...e-summary.html
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.09.2018, 16:42   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от SAMOUCHKA Посмотреть сообщение
для чего наследовать EventObject и EventListener? без этого все точно также работает.
Пока вы реализуете все необходимые функции или не передаете никуда, то да, работает.

Цитата:
Сообщение от SAMOUCHKA Посмотреть сообщение
В Qt все просто: объявил сигнал, реализовал слот, сконнектил и все! хоть два разных объекта, хоть в разных потоках.
1. И не заметили работы кучи кода и препроцессора. Если интересно, можете глянуть их лекции с конференций.
2. Ну так возьмите тот же MappedBus, раз уж библиотеки сравниваете. Зачем сравнивать голую Java и фреймворк?..
p51x на форуме Ответить с цитированием
Старый 21.09.2018, 21:28   #6
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Может это криво? но просто решил передавать ссылку одного объекта, во второй объект.

Класс Value содержит поле int, метод установки и метод печати
Код:
public class Value {
	private int value = 0;
	
	public void set(int value) {this.value = value;}
	
	public void print()
	{
		System.out.println("value: " + value);
	}
}
Класс MyThread содержит ссылку на объект Value и выполняется в отдельном потоке
Код:
import java.util.concurrent.TimeUnit;

public class MyThread extends Thread
{
    private int count = 0;
	
	private Value val = null;
	
	public MyThread(Value value)
	{
		val = value;
	}
	
	
	@Override
	public void run() 
	{
		while(true)
		{
			if(val == null)
				return;
			
			try 
			{
				TimeUnit.MILLISECONDS.sleep(2000);
				
				val.set(count);
				val.print();
				
				count++;
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
По сути объект MyThread является источником события (через каждые 2 секунды). а объект Value реагирует на это событие
Код:
public class Test {

	public static void main(String[] args)
	{
		Value val = new Value();
		
		MyThread thread = new MyThread(val);
		thread.start();
	}

}
SAMOUCHKA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка событий Кольша Win Api 4 16.10.2013 17:34
Использование событий Alexander_online C# (си шарп) 0 21.05.2013 15:53
Планировщик событий Евгений_Магистр Общие вопросы Delphi 10 05.10.2012 23:19
Обработчик событий kostolomeo Помощь студентам 1 22.05.2012 07:49
обработка событий CoRviN88 Помощь студентам 0 16.12.2010 13:46