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