При запуске — создать список с репликами List. Каждый бот должен управляться только одним потоком. Все боты выполняются в Executors.newFixedThreadPool(n) с фиксированным размером, и каждый выполняет 2 http-запроса и сохраняет ответы в себе.
После выполнения я вижу 1-2% дублирующихся запросов от разных ботов (сервер отправляет правильные данные, клянусь).
Сущность бота:
Код: Выделить всё
public class Bot
{
private final Statistic statisic = new Statistic();
private final Object mutex = new Object();
private String responseData;
void run()
{
synchronized(mutex) {
// first http call -> save to responseData
// second http call (use previous responseData as param) -> result
// save result to statistic
// cleanup responseData
}
}
}
Код: Выделить всё
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
Мобильная версия