Kann mir jemand vorschlagen, wie ich einen Parameter an einen Thread übergeben kann?
Und wie funktioniert das bei anonymen Klassen?
Kann mir jemand vorschlagen, wie ich einen Parameter an einen Thread übergeben kann?
Und wie funktioniert das bei anonymen Klassen?
Ich weiß, dass ich ein paar Jahre zu spät bin, aber ich bin auf dieses Thema gestoßen und habe einen unorthodoxen Ansatz gewählt. Ich wollte es tun, ohne eine neue Klasse, so ist das, was ich kam mit:
int x = 0;
new Thread((new Runnable() {
int x;
public void run() {
// stuff with x and whatever else you want
}
public Runnable pass(int x) {
this.x = x;
return this;
}
}).pass(x)).start();
Aber Sie haben tatsächlich eine neue Klasse erstellt - es ist nur eine anonyme Klasse :-) Andererseits ist es genau derselbe Ansatz wie in Lösung Nr.1 in stackoverflow.com/a/39214833/2024692
Sie können entweder die Thread
class
oder die Runnable
class
und geben Sie die gewünschten Parameter an. Einfache Beispiele finden Sie in der docs . Ich werde sie hierher portieren:
class PrimeThread extends Thread {
long minPrime;
PrimeThread(long minPrime) {
this.minPrime = minPrime;
}
public void run() {
// compute primes larger than minPrime
. . .
}
}
PrimeThread p = new PrimeThread(143);
p.start();
class PrimeRun implements Runnable {
long minPrime;
PrimeRun(long minPrime) {
this.minPrime = minPrime;
}
public void run() {
// compute primes larger than minPrime
. . .
}
}
PrimeRun p = new PrimeRun(143);
new Thread(p).start();
Um einen Thread zu erstellen, erstellen Sie normalerweise Ihre eigene Implementierung von Runnable. Übergeben Sie die Parameter an den Thread im Konstruktor dieser Klasse.
class MyThread implements Runnable{
private int a;
private String b;
private double c;
public MyThread(int a, String b, double c){
this.a = a;
this.b = b;
this.c = c;
}
public void run(){
doSomething(a, b, c);
}
}
Entweder schreiben Sie eine Klasse, die Runnable implementiert, und übergeben alles, was Sie brauchen, in einem entsprechend definierten Konstruktor, oder Sie schreiben eine Klasse, die Thread mit einem entsprechend definierten Konstruktor erweitert, der super() mit entsprechenden Parametern aufruft.
Ab Java 8 können Sie ein Lambda verwenden, um Parameter zu erfassen, die tatsächlich endgültig . Zum Beispiel:
final String param1 = "First param";
final int param2 = 2;
new Thread(() -> {
// Do whatever you want here: param1 and param2 are in-scope!
System.out.println(param1);
System.out.println(param2);
}).start();
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.
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>
.