Vra

Ek is redelik naïef wanneer dit kom by die wêreld van Java Threading en Concurrency. Ek is tans besig om te leer. Ek het 'n eenvoudige voorbeeld om te probeer om uit te vind hoe concurrency werk.

Hier is my kode:

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);
        }
    }

}

Wat moet ek doen om die kode gedrukte maak uit die getalle 0-99 in volgorde?

Was dit nuttig?

Oplossing

onderwerp poele gewoonlik gebruik word vir operasies wat nie nodig het sinchronisasie of is hoogs parallel .

Druk die getalle 0-99 agtermekaar is nie 'n konkurrente probleem en vereis drade te gesinchroniseer om te verhoed dat die druk van buite orde.

Ek beveel die neem van 'n blik op die Java concurrency les om 'n idee van concurrency kry in Java.

Ander wenke

Die idee van drade is nie om dinge agtermekaar te doen.

Jy sal 'n paar gedeel staat moet koördineer. In die voorbeeld, die toevoeging van byvoorbeeld velde om jou buitenste klas sal werk in hierdie voorbeeld. Verwyder die parameter van byvoeging. Voeg 'n slot voorwerp en 'n toonbank. Gryp die slot, inkrementeer druk die nommer, inkrementeer die getal, vrylating van die aantal.

Die eenvoudigste oplossing vir jou probleem is om 'n ThreadPool grootte van 1. egter gebruik, dit is nie regtig die soort van probleem sou 'n mens gebruik drade op te los.

Om uit te brei, as jy jou eksekuteur skep met:

this.exec = Executors.newSingleThreadExecutor();

dan jou drade sal almal geskeduleer en uitgevoer in die volgorde waarin hulle vir uitvoering ingedien. Daar is 'n paar scenario's waar dit 'n logiese ding om te doen, maar in die meeste gevalle Threads is die verkeerde gereedskap te gebruik om hierdie probleem op te los.

Hierdie soort van ding maak sin om te doen wanneer jy dit nodig om die taak uit te voer in 'n ander draad - miskien is dit neem 'n lang tyd om uit te voer en jy wil nie 'n GUI draad te sluit - maar jy doen nie nodig of wil nie die voorgelê take uit te voer op dieselfde tyd.

Die probleem is per definisie nie geskik om drade. Drade is onafhanklik uit te voer en daar is nie regtig 'n manier om te voorspel watter draad die eerste keer hardloop.

As jy wil om jou kode te verander om agtermekaar loop, verander voeg by:

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

Jy is nie die gebruik van drade (nie jou eie ten minste) en alles gebeur agtermekaar.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top