#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:
Вы можете предоставить получателям токен. Когда агент хочет отправить получателю, он должен сначала получить токен получателя. После завершения всей связи отправитель освободит токен, а затем другие могут отправлять получателю.