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

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

Сообщение Гость »

Я пытаюсь создать приложение для проверки API, которое должно отправлять запросы асинхронно.
При запуске — создать список с репликами 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
}
}
}
Субъект 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»