Domanda

Sto scrivendo una soluzione multi-thread in Java per connettere due sistemi, A e B.Il sistema A è completamente seriale, non filettato e fornirà i dati da inviare al sistema B.Il sistema B accetta dati da più fonti in modo asincrono e contemporaneamente.

Sto usando ThreadPoolExecutor per gestire i thread.Sto utilizzando un'istanza singleton statica di una classe, TP, che avvolge ThreadPoolExecutor (anch'esso statico) perché il sistema A non può creare nuovi oggetti ma può effettuare chiamate a oggetti statici.

Qui è dove sono bloccato.Sto facendo alcuni test di base della configurazione prima di dare il massimo.Ho creato due classi per i test, T1 e T2.Ognuna di queste classi importa la classe TP (dove viene creato il singleton statico).T1 aggiunge alcuni oggetti alla coda TP e poi T2 ne aggiunge altri.

Anche se l'oggetto TP è dichiarato statico, sembra che ci siano due versioni in esecuzione in parallelo.Gli oggetti inviati alla coda da T2 vengono eseguiti prima che gli oggetti inviati da T1 siano stati tutti eseguiti.Inoltre, poiché né T1 né T2 chiamano shutdown() su ThreadPoolExector, entrambi si bloccano e non terminano mai.

Come posso creare un'istanza statica del demone di un battistrada che sostanzialmente si sveglia ogni volta che invio qualcosa da elaborare, anche da diversi eseguibili Java?

È stato utile?

Soluzione

Se stai eseguendo due processi separati, hai due tipi separati e due istanze separate, indipendentemente dal fatto che si tratti di un singleton.

Se desideri che due processi diversi comunichino tra loro, dovrai affrontare il problema in modo completamente separato.Sono disponibili numerosi meccanismi IPC diversi: reti, pipe denominate (complicato da Java IIRC), file mappati in memoria, una semplice directory condivisa in cui un processo inserisce attività affinché l'altro possa elaborarle, ecc.

Inoltre, non è chiaro esattamente cosa sia bloccato o come sia configurato il pool di thread.Se il problema è davvero il lato del threading (piuttosto che il lato IPC), pubblica un breve ma completare programma che illustra il problema.

Altri suggerimenti

Se la dimensione del pool di thread maggiore di 1, allora non v'è alcuna garanzia che tutti gli oggetti T1 verranno elaborati prima.

Sembra a me come si sta eseguendo due differenti 'principali' classi che ogni utilizzare questa stessa classe Singleton statica. In questo caso, ci saranno due istanze del Singleton creato - uno in ogni JVM.

Credo che ciò che si vuole fare è avere il pool di thread incapsulato in un altro processo che viene eseguito come un servizio ed espone qualche meccanismo per IPC come Skeet ha commentato. Un modo comune per farlo sarebbe quello di esporre una coda JMS per ricevere le richieste provenienti da diversi produttori e hanno il consumatore (il demone) inviare richieste che gli pervengono al pool di thread per l'elaborazione.

Per l'esecuzione di questo servizio come un demone, si potrebbe ospitarlo in un contenitore o usare qualcosa come il Java Servizio Wrapper se si sta in esecuzione su Windows.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top