2016-04-14 10 views
6

Czy można uruchomić wielowątkową aplikację Java w deterministyczny sposób? Mam na myśli zawsze takie samo przełączanie wątków w dwóch różnych przebiegach mojej aplikacji."Nie można odtworzyć" - czy możliwe jest wielowymiarowe oznaczanie Java?

Powodem tego jest przeprowadzenie symulacji dokładnie w takich samych warunkach podczas każdego biegu.

Podobny przypadek występuje wtedy, gdy daje się dowolne nasienie przy użyciu generatora liczb losowych, aby uzyskać zawsze tę samą "losową" sekwencję.

+1

szeregowanie Temat jest kontrolowane przez system operacyjny, a nie Java. –

+0

Jeśli zsynchronizowałeś swój kod wystarczająco ostrożnie i zależy tylko od wejścia z przodu, to zawsze powinno wyglądać, że działa tak samo. (Lub go obrócić, jeśli wyniki zależą od określonego czasu każdego uruchomienia, nie zsynchronizowałeś wystarczająco dobrze swojego kodu.) W zależności od tego, czego naprawdę potrzebujesz, możesz również spróbować implementacji wirtualnej maszyny Java w czasie rzeczywistym. – biziclop

+1

@biziclop, Jeśli twój program jest tak dokładnie zsynchronizowany, są szanse, że straciłeś przynajmniej niektóre korzyści z używania wielu wątków. –

Odpowiedz

4

Nie jestem świadomy żadnego praktycznego sposobu, aby to zrobić.

Teoretycznie możliwe byłoby implementowanie interpretera kodu bajtowego z zachowaniem całkowicie deterministycznym przy pewnych założeniach: . Będziesz musiał zasymulować wiele wątków, implementując wątki i harmonogramowanie wątków w całości w oprogramowaniu i używając pojedynczego wątku natywnego.


1 - na przykład, nie ma wejścia/wyjścia, a nie korzystanie z zegarem systemowym.

+0

Potencjalnie musiałbyś wdrożyć GC. – biziclop

+0

@biziclop - Może nie. Jedynymi źródłami niedeterministycznymi związanymi z GC, o które musisz się martwić, są hash identyfikacyjne oparte na adresach pamięci i finalizacji. Oba można rozwiązać, jak sądzę. –

4

Nie jest to możliwe (oprócz samodzielnej symulacji) do wielokrotnego przeplatania wątków w ten sam sposób za każdym razem. Wątki nie są zaprojektowane do tego.

Jeśli chcesz uzyskać wyniki deterministyczne, nie używaj nici.

0

Cytując według OldCurmudgeon, nie jest to możliwe w przypadku wielowątkowości.

Jeśli użytkownik zdecyduje się użyć jednego Thread, wolę newSingleThreadExecutor do normalnego Thread ze względu na elastyczność i zalety newSingleThreadExecutor

Korzystanie

newSingleThreadExecutor od Executors

public static ExecutorService newSingleThreadExecutor() 

Tworzy executor używa pojedynczego wątku roboczego działającego w nieskończonej kolejce. (Należy jednak pamiętać, że jeśli ten pojedynczy wątek zostanie zakończony z powodu awarii podczas wykonywania przed zamknięciem systemu, nowy zajmie jego miejsce, jeśli będzie to konieczne do wykonania kolejnych zadań.)

Zadania są gwarantowane do wykonywania sekwencyjnie i nie więcej niż jeden zadanie będzie aktywne w danym momencie. W odróżnieniu od równoważnego newFixedThreadPool (1) zwracany executor nie może być rekonfigurowalny w celu użycia dodatkowych wątków.

Powiązane SE pytania:

Difference between Executors.newFixedThreadPool(1) and Executors.newSingleThreadExecutor()

ExecutorService vs Casual Thread Spawner

Powiązane problemy