"Невозможно воспроизвести" - возможна ли многопоточность в Java?

Возможно ли запустить многопоточное Java-приложение детерминированным способом? Я имею в виду, чтобы всегда было одно и то же переключение потоков в двух разных запусках моего приложения.

Причиной этого является запуск симуляции в одинаковых условиях при каждом запуске.

Подобный случай, когда каждый дает некоторый произвольный начальный вес при использовании генератора случайных чисел, чтобы получить всегда ту же самую "случайную" последовательность.

3 ответа

Решение

Я не знаю ни одного практического способа сделать это.

Теоретически, было бы возможно реализовать интерпретатор байт-кода с полностью детерминированным поведением при определенных допущениях1. Вам нужно будет смоделировать несколько потоков, реализуя потоки и планирование потоков полностью в программном обеспечении и используя один собственный поток.


1 - Например, нет ввода-вывода и не используются системные часы.

Нет, невозможно (кроме как смоделировать это самостоятельно) использовать несколько потоков, чередующихся одинаково каждый раз вокруг. Темы не предназначены для этого.

Если вам нужны детерминированные результаты, не используйте потоки.

Как указано OldCurmudgeon, это невозможно с многопоточностью.

Если вы решили использовать один Thread, Я предпочитаю newSingleThreadExecutor к норме Thread благодаря гибкости и преимуществам newSingleThreadExecutor

использование

newSingleThreadExecutor от Executors

public static ExecutorService newSingleThreadExecutor()

Создает Исполнителя, который использует один рабочий поток, работающий из неограниченной очереди. (Тем не менее, обратите внимание, что если этот единственный поток завершается из-за сбоя во время выполнения до выключения, новый будет занимать его место, если это необходимо для выполнения последующих задач.)

Задачи гарантированно выполняются последовательно, и в любой момент времени будет активным не более одной задачи. В отличие от эквивалентного newFixedThreadPool(1), возвращаемый исполнитель гарантированно не может быть реконфигурируем для использования дополнительных потоков.

Связанные вопросы SE:

Разница между Executors.newFixedThreadPool(1) и Executors.newSingleThreadExecutor ()

ExecutorService vs Casual Spawner

Другие вопросы по тегам