Frage

Ich bin ziemlich naiv, wenn es um die Welt des Java-Threading und Concurrency kommt. Ich versuche zur Zeit zu lernen. Ich habe ein einfaches Beispiel, um zu versuchen, herauszufinden, wie Gleichzeitigkeit funktioniert.

Hier ist mein Code:

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

}

Was muß ich tun, um den Code Druck aus den Zahlen 0-99 in der angegebenen Reihenfolge zu machen?

War es hilfreich?

Lösung

Thread-Pools in der Regel für Operationen verwendet werden, die nicht brauchen, Synchronisation a href = oder sind hoch < "http://en.wikipedia.org/wiki/Parallel_algorithm" rel = "nofollow noreferrer"> parallel .

Drucken der Zahlen 0-99 der Reihe ist keine gleichzeitige Problem und erfordert Threads synchronisiert werden Druck aus, um zu vermeiden.

Ich empfehle, einen Blick auf die Java Concurrency Lektion eine Vorstellung von Gleichzeitigkeit in Java zu erhalten.

Andere Tipps

Die Idee der Threads ist nicht zu tun, Dinge der Reihe nach.

Sie werden einige gemeinsam genutzten Zustand müssen zu koordinieren. In dem Beispiel, das Hinzufügen Instanz Felder zu Ihrer äußeren Klasse wird in diesem Beispiel arbeiten. Entfernen Sie die Parameter von zus. Fügen Sie ein Sperrobjekt und einen Zähler. Besorgen Sie sich die Sperre, erhöhen die Anzahl drucken, erhöhen die Zahl, lassen Sie die Nummer ein.

Die einfachste Lösung für Ihr Problem ist es, einen Threadpool einer Größe von 1 jedoch zu verwenden, ist dies nicht wirklich die Art von Problem ist, würde man Threads lösen.

zu erweitern, wenn Sie Ihren Testamentsvollstrecker erstellen mit:

this.exec = Executors.newSingleThreadExecutor();

dann Ihre Fäden all geplant und in der Reihenfolge ausgeführt werden, die sie zur Ausführung vorgelegt wurden. Es gibt ein paar Szenarien, in denen dies eine logische Sache zu tun, aber in den meisten Fällen Themen sind das falsche Werkzeug zu verwenden, um dieses Problem zu lösen.

Diese Art der Sache sinnvoll ist zu tun, wenn Sie die Aufgabe in einem anderen Thread ausführen müssen - vielleicht dauert es eine lange Zeit auszuführen, und Sie wollen nicht einen GUI-Thread blockieren - aber Sie nicht brauche oder nicht will, dass die eingereichten Aufgaben zur gleichen Zeit ausgeführt werden.

Das Problem ist per Definition nicht auf dem Gewinde geeignet. Themen sind unabhängig laufen und es ist nicht wirklich eine Möglichkeit, vorherzusagen, welcher Thread zuerst ausgeführt wird.

Wenn Sie Ihren Code zu ändern, der Reihe nach ausgeführt werden, fügen zu ändern:

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

Sie sind nicht mit Gewinde (nicht selbst zumindest) und alles, was passiert, nacheinander.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top