2016-04-14 4 views
6

Ist es möglich, Multithread-Java-Anwendungen auf deterministische Weise auszuführen? Ich meine, immer den gleichen Threadwechsel in zwei verschiedenen Läufen meiner Anwendung zu haben."Kann nicht reproduzieren" - ist Java deterministisches Multithreading möglich?

Grund dafür ist, dass die Simulation in jedem Lauf unter genau denselben Bedingungen ausgeführt wird.

Ähnliche Fall ist, wenn man einige zufällige Seed bei der Verwendung von Zufallsgenerator, um immer die gleiche "zufällige" Sequenz zu erhalten gibt.

+1

Thread-Scheduling durch das Betriebssystem gesteuert wird, nicht Java. –

+0

Wenn Sie Ihren Code sorgfältig genug synchronisiert haben und nur von der verfügbaren Eingabe abhängig sind, sollte es immer so aussehen. (Oder, um es umzudrehen, wenn die Ergebnisse vom spezifischen Timing jedes Laufs abhängen, haben Sie Ihren Code nicht gut genug synchronisiert.) Je nachdem, was Sie wirklich benötigen, können Sie auch eine Echtzeit-Implementierung der Java VM versuchen. – biziclop

+1

@biziclop, Wenn Ihr Programm so gründlich synchronisiert ist, haben Sie wahrscheinlich einige der Vorteile der Verwendung mehrerer Threads verloren. –

Antwort

4

Mir ist keine praktische Möglichkeit bekannt, dies zu tun.

Theoretisch wäre es möglich, einen Bytecode-Interpreter mit einem vollständig deterministischen Verhalten unter bestimmten Annahmen zu implementieren. Sie müssten die mehreren Threads simulieren, indem Sie die Threads und die Thread-Planung vollständig in Software implementieren und einen einzelnen nativen Thread verwenden.


1 - Zum Beispiel keine I/O, und keine Verwendung des Systemtakts.

+0

Sie müssten möglicherweise auch GC implementieren. – biziclop

+0

@biziclop - Vielleicht nicht. Die einzigen GC-bezogenen Quellen von Nicht-Determinismus, um die Sie sich sorgen müssen, sind Identitäts-Hashcodes, die auf Speicheradressen und Finalisierung basieren. Beide könnten behandelt werden, denke ich. –

4

Nein, es ist nicht möglich (außer, es selbst zu simulieren), mehrfache Interleaving-Threads auf die gleiche Weise zu verwenden. Threads sind dafür nicht gedacht.

Wenn Sie deterministische Ergebnisse wünschen, verwenden Sie keine Threads.

0

Wie von OldCurmudgeon zitiert, ist es nicht mit Multi Threading möglich.

Wenn Sie sich entscheiden, einzelne Thread zu verwenden, ziehe ich newSingleThreadExecutor normal Thread durch Flexibilität und Vorteile von newSingleThreadExecutor

Verwenden

newSingleThreadExecutor von Executors

public static ExecutorService newSingleThreadExecutor() 

Erstellt eine Executor verwendet einen einzelnen Worker-Thread, der aus einer unbegrenzten Warteschlange operiert. (Beachten Sie jedoch, dass, wenn dieser einzelne Thread aufgrund eines Fehlers während der Ausführung vor dem Herunterfahren beendet wird, ein neuer Platz für die Ausführung nachfolgender Tasks benötigt wird.)

Tasks werden garantiert nacheinander ausgeführt und nicht mehr als einer Aufgabe wird zu jeder Zeit aktiv sein. Im Gegensatz zu dem ansonsten äquivalenten newFixedThreadPool (1) ist der zurückgegebene Executor garantiert nicht rekonfigurierbar, um zusätzliche Threads zu verwenden.

Verwandte SE Fragen:

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

ExecutorService vs Casual Thread Spawner

Verwandte Themen