Странное состояние гонки в Java ThreadPoolExecutorJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Странное состояние гонки в Java ThreadPoolExecutor

Сообщение Anonymous »

Я пытаюсь создать приложение для проверки API, которое должно отправлять запросы асинхронно с использованием пула ботов, пока дата завершения не наступила.
При запуске создается окончательный список создается и будет выполняться до даты прекращения. Идея состоит в том, что на каждой итерации цикла 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;
}
}
}
Субъект BotRunner:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»