2016-04-14 17 views
6

È possibile eseguire un'applicazione Java multithread in modo deterministico? Intendo avere sempre lo stesso thread che passa in due diverse sessioni della mia applicazione."Can not reproduce" - è possibile il multithreading deterministico Java?

Il motivo è quello di eseguire la simulazione esattamente nelle stesse condizioni in ogni corsa.

In questo caso si assegna un seme arbitrario quando si utilizza un generatore di numeri casuali per ottenere sempre la stessa sequenza "casuale".

+1

programmazione dei thread è controllata dal sistema operativo, non è Java. –

+0

Se il codice è stato sincronizzato con cura e dipende solo dall'input disponibile in anticipo, dovrebbe sempre apparire allo stesso modo. (O per capovolgerlo, se i risultati dipendono dalla tempistica specifica di ogni esecuzione, non hai sincronizzato abbastanza bene il tuo codice.) A seconda di cosa hai realmente bisogno, potresti anche provare un'implementazione in tempo reale della VM Java. – biziclop

+1

@biziclop, Se il tuo programma è così completamente sincronizzato, è probabile che tu abbia perso almeno alcuni dei vantaggi dell'utilizzo di più thread. –

risposta

4

Non sono a conoscenza di alcun modo pratico per farlo.

In teoria, sarebbe possibile implementare un interprete bytecode con un comportamento interamente deterministico in base a determinati presupposti . È necessario simulare i thread multipli implementando i thread e la pianificazione dei thread interamente nel software e utilizzando un singolo thread nativo.


1 - Per esempio, nessuno di I/O, e nessun uso del clock di sistema.

+0

Dovresti anche implementare GC. – biziclop

+0

@biziclop - Forse no. Le uniche fonti di non determinismo legate al GC di cui dovresti preoccuparti sono i codici di hash dell'identità basati sugli indirizzi di memoria e la finalizzazione. Entrambi potrebbero essere affrontati, credo. –

4

No, non è possibile (oltre a simulare da soli) l'uso di più thread che si alternano nello stesso modo ogni volta. I thread non sono progettati per farlo.

Se si desidera ottenere risultati deterministici, non utilizzare thread.

0

Come indicato da OldCurmudgeon, non è possibile con la filettatura multipla.

Se si decide di utilizzare un'unica Thread, preferisco newSingleThreadExecutor alla normalità Thread grazie alla flessibilità e vantaggi di newSingleThreadExecutor

Usa

newSingleThreadExecutor da Executors

public static ExecutorService newSingleThreadExecutor() 

Crea un esecutore che utilizza un singolo thread di lavoro che opera su una coda illimitata. (Si noti tuttavia che se questo thread singolo termina a causa di un errore durante l'esecuzione prima dello spegnimento, ne verrà sostituito uno nuovo se necessario per eseguire le attività successive.)

Le attività sono garantite per l'esecuzione in sequenza e non più di una l'attività sarà attiva in qualsiasi momento. A differenza del newFixedThreadPool (1) altrimenti equivalente, l'executor restituito non è riconfigurabile per utilizzare thread aggiuntivi.

domande SE correlati:

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

ExecutorService vs Casual Thread Spawner