338 Stimmen

Wie kann ich einen Parameter an einen Java-Thread übergeben?

Kann mir jemand vorschlagen, wie ich einen Parameter an einen Thread übergeben kann?

Und wie funktioniert das bei anonymen Klassen?

6 Stimmen

Könnten Sie vielleicht noch etwas mehr dazu sagen, was genau Sie zu tun versuchen? Es gibt viele verschiedene Techniken, die aber alle vom Endziel abhängen.

4 Stimmen

Meinen Sie die Übergabe eines Parameters an einen bereits laufenden Thread? Denn in allen aktuellen Antworten geht es um die Übergabe von Parametern an neue Threads...

0 Stimmen

Jetzt können Sie Consumer<T> .

7voto

Stuart Cardall Punkte 1733

In Java 8 können Sie Folgendes verwenden lambda Ausdrücke mit dem Gleichzeitigkeits-API & die ExecutorService als übergeordneter Ersatz für die direkte Arbeit mit Threads:

newCachedThreadPool() Erzeugt einen Thread-Pool, der neue Threads Threads erstellt, aber zuvor erstellte Threads wiederverwendet, wenn sie verfügbar sind. Diese Pools verbessern normalerweise die Leistung von Programmen, die viele kurzlebige asynchrone Aufgaben ausführen.

    private static final ExecutorService executor = Executors.newCachedThreadPool();

    executor.submit(() -> {
        myFunction(myParam1, myParam2);
    });

Siehe auch executors javadocs .

1 Stimmen

Endlich eine Möglichkeit, dies ohne diese lästigen Felder zu tun. Jetzt muss ich nur noch warten, bis mein Produkt auf Java 8 aktualisiert wird.

4voto

Java42 Punkte 7508

Parameterübergabe über die Methoden start() und run():

// Tester
public static void main(String... args) throws Exception {
    ThreadType2 t = new ThreadType2(new RunnableType2(){
        public void run(Object object) {
            System.out.println("Parameter="+object);
        }});
    t.start("the parameter");
}

// New class 1 of 2
public class ThreadType2 {
    final private Thread thread;
    private Object objectIn = null;
    ThreadType2(final RunnableType2 runnableType2) {
        thread = new Thread(new Runnable() {
            public void run() {
                runnableType2.run(objectIn);
            }});
    }
    public void start(final Object object) {
        this.objectIn = object;
        thread.start();
    }
    // If you want to do things like setDaemon(true); 
    public Thread getThread() {
        return thread;
    }
}

// New class 2 of 2
public interface RunnableType2 {
    public void run(Object object);
}

3voto

Brian Agnew Punkte 260470

Sie können eine Klasse von Runnable ableiten und während der Konstruktion (z.B.) den Parameter übergeben.

Dann starten Sie ihn mit Thread.start(Runnable r);

Wenn Sie meinen während der Thread läuft, dann halten Sie einfach einen Verweis auf Ihr abgeleitetes Objekt im aufrufenden Thread und rufen die entsprechenden Setter-Methoden auf (gegebenenfalls synchronisiert)

2voto

Chromium Punkte 507

Es gibt eine einfache Möglichkeit, Parameter an Runnables zu übergeben. Code:

public void Function(final type variable) {
    Runnable runnable = new Runnable() {
        public void run() {
            //Code adding here...
        }
    };
    new Thread(runnable).start();
}

2voto

Mihir Patel Punkte 404

Nein, Sie können keine Parameter an die run() Methode. Die Signatur sagt Ihnen das (sie hat keine Parameter). Am einfachsten wäre es wohl, ein eigens dafür entwickeltes Objekt zu verwenden, das im Konstruktor einen Parameter aufnimmt und ihn in einer endgültigen Variablen speichert:

public class WorkingTask implements Runnable
{
    private final Object toWorkWith;

    public WorkingTask(Object workOnMe)
    {
        toWorkWith = workOnMe;
    }

    public void run()
    {
        //do work
    }
}

//...
Thread t = new Thread(new WorkingTask(theData));
t.start();

Sobald Sie das tun, müssen Sie auf die Datenintegrität des Objekts achten, das Sie an die "WorkingTask" übergeben. Die Daten befinden sich nun in zwei verschiedenen Threads, so dass Sie sicherstellen müssen, dass sie Thread-sicher sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X