При запуске создается окончательный список создается и будет выполняться до даты прекращения. Идея состоит в том, что на каждой итерации цикла while мы будем перебирать List и пытаться запустить их через исполнителя в оболочке BotRunner. (если бот уже запущен другим потоком, то просто зависаем на мониторе мьютекса и ждем завершения Bot#run от другого потока. После этого — выполняем Bot#run нормально).
После выполнения я вижу 1-2% дублирующихся запросов от разных ботов (сервер отправляет правильные данные, клянусь). Похоже на простое состояние гонки, но я не понимаю, в чем причина. Это бот? - Думаю, нет (используйте синхронизировано). Это окончательный список? - нет предположения (состояние списка не меняем)
Субъект-бот:
Код: Выделить всё
public class Bot
{
private final BotStatistic statisic = new BotStatistic();
private final Object mutex = new Object();
private String responseData;
void run()
{
synchronized(mutex) {
// first http call -> responseData = "j43iFS135SFSF";
// second http call(responseData) -> {"success": "true"}
// save to statistic
// responseData = null;
}
}
}
Код: Выделить всё
public class BotRunner implements Runnable
{
private final Bot bot;
public BotRunner(Bot bot)
{
this.bot = bot;
}
@Override
public void run()
{
bot.run();
}
}
Код: Выделить всё
//init executor
LocalDateTime termination = LocalDateTime.now().plusSeconds(5L);
while (LocalDateTime.now().isBefore(termination))
{
for (Bot bot : bots)
{
executor.execute(new BotRunner(bot));
}
}
//shutdown & close executor
- не помогает.
Код: Выделить всё
String -> final StringBuffer - Использовать локальную переменную метода String не помогает.
Подробнее здесь: https://stackoverflow.com/questions/781 ... olexecutor
Мобильная версия