Domanda

Sono abbastanza ingenuo quando si tratta del mondo del threading e della concorrenza Java. Attualmente sto cercando di imparare. Ho fatto un semplice esempio per provare a capire come funziona la concorrenza.

Ecco il mio codice:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadedService {

    private ExecutorService exec;

    /**
     * @param delegate
     * @param poolSize
     */
    public ThreadedService(int poolSize) {
        if (poolSize < 1) {
            this.exec = Executors.newCachedThreadPool();
        } else {
            this.exec = Executors.newFixedThreadPool(poolSize);
        }
    }

    public void add(final String str) {
        exec.execute(new Runnable() {
            public void run() {
                System.out.println(str);
            }

        });

    }

    public static void main(String args[]) {
        ThreadedService t = new ThreadedService(25);
        for (int i = 0; i < 100; i++) {
            t.add("ADD: " + i);
        }
    }

}

Cosa devo fare per fare in modo che il codice stampi i numeri da 0 a 99 in ordine sequenziale?

È stato utile?

Soluzione

Pool di thread vengono generalmente utilizzati per operazioni che non richiedono sincronizzazione o sono altamente parallel .

Stampare i numeri da 0 a 99 in sequenza non è un problema simultaneo e richiede che i thread siano sincronizzati per evitare la stampa fuori servizio.

Consiglio di dare un'occhiata alla lezione sulla concorrenza Java per avere un'idea della concorrenza in Java.

Altri suggerimenti

L'idea dei thread non è di fare le cose in sequenza.

Sarà necessario un certo stato condiviso per coordinare. Nell'esempio, in questo esempio funzionerà l'aggiunta di campi di istanza alla classe esterna. Rimuovi il parametro da aggiungi. Aggiungi un oggetto lock e un contatore. Prendi il lucchetto, incrementa stampa il numero, incrementa il numero, rilascia il numero.

La soluzione più semplice al tuo problema è usare una dimensione ThreadPool di 1. Tuttavia, questo non è proprio il tipo di problema che si potrebbe usare per risolvere i thread.

Per espandere, se crei il tuo esecutore con:

this.exec = Executors.newSingleThreadExecutor();

quindi i tuoi thread saranno tutti programmati ed eseguiti nell'ordine in cui sono stati inviati per l'esecuzione. Ci sono alcuni scenari in cui questa è una cosa logica da fare, ma nella maggior parte dei casi i thread sono lo strumento sbagliato da utilizzare per risolvere questo problema.

Questo tipo di cose ha senso fare quando è necessario eseguire l'attività in un thread diverso - forse ci vuole molto tempo per eseguire e non si desidera bloccare un thread GUI - ma non si necessità o non si desidera che le attività inviate vengano eseguite contemporaneamente.

Il problema non è per definizione adatto ai thread. I thread vengono eseguiti in modo indipendente e non esiste davvero un modo per prevedere quale thread viene eseguito per primo.

Se vuoi cambiare il tuo codice per eseguirlo in sequenza, cambia aggiungi a:

public void add(final String str) {
    System.out.println(str);
}

Non stai usando i thread (almeno non i tuoi) e tutto accade in sequenza.

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