Multiple thread e singola sorgente di output

0

Per motivi di esercizio, dì di avere un file di input con una serie di righe di testo con l'obiettivo di invertire le rispettive sequenze di caratteri.

Ora introducete 5 thread che eseguiranno ciascuno il reverse, il thread 1 si occuperà della riga 1, il thread 2 si occuperà della riga 2 e così via.

Se lo scopo è salvare queste righe invertite in ordine, come le salverei nello stesso file?

P.S: Ho pensato di avere una sorta di coda ma non c'è alcuna garanzia sull'ordine. Inoltre, mi chiedo se ci sia un modo per bloccare temporaneamente il file e avere un thread in attesa del suo turno. Immagino di dover tenere traccia di quale linea è stata salvata.

    
posta James P. 29.03.2013 - 16:22
fonte

3 risposte

3

Ciò di cui hai bisogno per un problema come questo è una finestra scorrevole per conservare l'output.

Le righe vengono passate in sequenza ai thread da elaborare e, allo stesso tempo, viene assegnato uno slot con lo stesso numero nella finestra. Quando una linea ritorna, il risultato viene inserito nello slot numerato. Quando lo slot con il numero più basso nella finestra viene riempito, si emette la sua linea sull'output e si fa scorrere la finestra verso l'alto di uno slot, ripetendo finché non si raggiunge uno slot che non contiene una linea elaborata. Dato che ora hai uno o più thread liberi, puoi iniziare a processare il prossimo set di linee per gli slot che hai appena aperto spostando la finestra.

Il modo in cui ridimensionare la finestra dipenderà dal modo in cui gestisci i tuoi thread. Si potrebbe avere un thread che mastica su una linea molto lunga nella parte inferiore della finestra mentre altri lavorano su un gruppo di short, che fermerà tutto se tutti gli altri slot nella finestra sono occupati. Le tue scelte consistono nel far crescere la finestra (che è accettabile) in modo da poter tenere occupati i tuoi thread o non fare nulla finché non termina la discussione sullo slot basso.

    
risposta data 29.03.2013 - 17:59
fonte
2

hai bisogno di ciò che definirei una soluzione produttore-trasformatore-consumatore

puoi adattare un prodotto-consumatore esistente ma ogni elemento ha un complete flag

ci saranno 3 puntatori: uno per la testa; uno per la coda e uno per lo "stomaco" che puntano all'elemento successivo che deve essere trasformato

la coda non può avanzare oltre un elemento che non ha il flag complete impostato,

il puntatore dello stomaco avanza quando i thread concorrenti tirano gli elementi (senza rimuoverlo dalla coda) per trasformare e imposta il flag completo solo quando la trasformazione viene eseguita

    
risposta data 29.03.2013 - 17:51
fonte
0

L'ho messo completamente fuori senza commenti. Se non capisci cosa sta facendo, sentiti libero di chiedere. Se hai intenzione di inviarlo come risposta all'intervista, preparati a discuterne.

public class SequencedThread {

    private final Runnable runnable;
    private final SequencedThread predecessor;

    public SequencedThread(Runnable runnable, SequencedThread predecessor) {
        this.runnable = runnable;
        this.predecessor = predecessor;
    }

    public void run() {
        try {
            if (predecessor != null) {
                predecessor.join();
            }
        }
        catch (InterruptedException ex) {
            // do something here
        }

        runnable.run();
    }
}
    
risposta data 29.03.2013 - 17:06
fonte

Leggi altre domande sui tag