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

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

Сообщение Anonymous »

Что должен делать код:
  • выполнять Bot#run синхронно.
Что нужно исправить:
  • совместное использование ресурса (

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

    Bot.responseData or.. more
    ) между другими ботами и потоками.
Этапы выполнения Bot.run():
  • http-запрос -> получить случайное значение с сервера (например, f8c3de3d-1fea-4d7c-a8b0-29f63c4c3454). (сервер всегда возвращает случайное значение!)
  • сохранить значение в Bot.responseData.
  • http-запрос (используйте Bot.responseData в качестве параметра) -> верните JSON.
  • сохраните JSON в Bot.statistics.
  • Cleanup Bot.responseData = null.
Субъект бота:

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

public class Bot
{
private final BotStatistic statisic = new BotStatistic();
private final Object mutex = new Object();
private String responseData;

void run()
{
synchronized(mutex)
{
String myHost = "http://myhost";
firstCall(myHost)
secondCall(myHost);
cleanup();
}
}

private void firstCall(String host)
{
// first http call -> responseData = "f8c3de3d-1fea-4d7c-a8b0-29f63c4c3454";
}

private void secondCall(String host)
{
// second http call(responseData) ->
// JSON {"success": true, "requestValue": "f8c3de3d-1fea-4d7c-a8b0-29f63c4c3454"}
statistic.add(json);
}

private void cleanup()
{
this.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
Что я вижу сейчас
После выполнения я вижу 1–2% дубликатов Bot.responseData от РАЗНОГО бота. Вот такие дела:

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

thread-1 : start (Bot@44g35)
thread-1 : f8c3de3d-1fea-4d7c-a8b0-29f63c4c3454
thread-2 : start (Bot@898g)
thread-2 : f8c3de3d-1fea-4d7c-a8b0-29f63c4c3454
thread-1 : end
thread-2 : end
Что мне нужно увидеть

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

thread-1 : start (Bot@44g35)
thread-1 : f8c3de3d-1fea-4d7c-a8b0-29f63c4c3454
thread-2 : start (Bot@898g)
thread-2 : 018b2f19-e79e-7d6a-a56d-29feb6211b04
thread-1 : end
thread-2 : end
Я был бы очень признателен, если бы кто-нибудь мог мне помочь :)

Подробнее здесь: https://stackoverflow.com/questions/781 ... olexecutor
Ответить

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

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

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

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

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