Проблема с несколькими агентами

#java #multithreading

#java #многопоточность

Вопрос:

допустим, у вас есть несколько агентов (каждый из них является собственным процессом), которые могут взаимодействовать друг с другом (агенты общаются только парами); как вы гарантируете, что как только два агента начнут взаимодействовать, никакой другой агент не сможет их прервать?

Вот важная часть кода:

 class Agent {
    private void send(int to, byte[] message) {...};
    private void receive(int from, byte[] message) {...};
}
  

Метод send отправляет сообщение указанному агенту, а метод receive обрабатывает полученное сообщение, которое приходит от других агентов. Итак, допустим, агенты с id = 1 и id = 2 обмениваются несколькими сообщениями: как мне гарантировать, что ни один из агентов не обрабатывает (в своем методе получения) сообщения от любого другого агента во время их обмена? Я пытался фильтровать сообщения на основе идентификатора агента (сохраняя их в переменной int), но, похоже, это не работает должным образом?

Комментарии:

1. Собственный процесс или собственный поток? Прочтите это , если вы не уверены.

2. @Ishtar: хороший момент, я предположил, что в моем ответе есть темы…

3. Итак, @ark, являются ли процессы агента многопоточными или нет?

4. @Ishtar: это процессы, а не потоки

5. Я думаю, нам нужно больше знать о реализации send () и receive (), чтобы ответить на этот вопрос.

Ответ №1:

Благодаря процессам и использованию TCP для IPC, в любое время у каждого агента должен быть открыт не более одного сокета. Тогда второй агент никогда не сможет общаться с уже разговаривающим агентом.

Ответ №2:

Вы можете предоставить получателям токен. Когда агент хочет отправить получателю, он должен сначала получить токен получателя. После завершения всей связи отправитель освободит токен, а затем другие могут отправлять получателю.