Threads Methode von Threads erledigen lassen

PeterL

Mitglied
Hallo,

Ich möchte meinen Code gerne von Threads ausführen lassen; hab da aber so meine Probleme. Ohne Threads läuft es; hätte aber gerne das ganze parallel laufen.

Java:
public class WSManager {
	
	private final S3 s3;
	private final AEB aeb;
	
	
	public WSManager(S3 s3, AEB aeb) {
		this.s3 = s3;
		this.aeb = aeb;
	}
	
	public String deployWS(String file_path, String aws_key, String aws_secret_key, String ec2_key_pair) {
		
(..)
		return url;
	}
}

Momentan wird das ganze wie folgt aufgerufen:

Java:
public class Test {
	
	private static final String FILE_PATH = "Pfad zur Datei";
	private static final String FILE_PATH2 = "Pfad zur Datei2";
	
	private static final String KEY = "IwelcheZeichen"; 
	private static final String SECRET_KEY = "IwelcheZeichen";
	private static final String KEY_PAIR = "IwelcheZeichen"; 
	

	public static void main(String[] args) {
		
		Credentials credentials = new Credentials(Test.KEY, Test.SECRET_KEY);
		
		WSManager wsmanager = new WSManager(new S3Client(credentials), new AEBClient(credentials));
		
		String url = wsmanager.deployWS(Test.FILE_PATH, Test.KEY, Test.SECRET_KEY, Test.KEY_PAIR);
		String url2 = wsmanager.deployWS(Test.FILE_PATH2, Test.KEY, Test.SECRET_KEY, Test.KEY_PAIR);
		System.out.println(url);
		System.out.println(url2);
	}
}

Wie bekomm ich hin, dass die beiden "deployWS" parallel ablaufen?
WSManager muss, denke ich mal Runnable implementieren; aber wie bekomme ich das mit der Parameterübergabe usw. hin?

MfG
Peter
 
du kannst auch Thread erweitern... ist mehr oder weniger Geschmackssache.
Tatsache ist aber, dass du deinen Konstruktor ganz normal weiterverwenden kannst, du musst nur irgendwann mal thread.start() aufrufen, um den Thread tatsächlich zu starten.

EDIT: Du könntest z.b: in deiner Deploy-Methode einfach die Parameter entgegennehmen und sie in Instanzvariablen speichern. Läuft der Thread dann irgendwann mal, kannst du in seiner run-Methode auf diese Instanzvariablen zugreifen (was man eleganterweise natürlich auch nicht unbedingt in die run-Methode reinschreibt sondern auch wieder irgend wo anders hin auslagert)...


Dachte da an sowas wie:
Java:
public class MyClass extends Thread {
    int a, b, c;
    public void deploy(int a, int b, int c) {
        this.a = a; 
        this.b = b; 
        this.c = c;
    }

    public void run() {
        // erledige den eigentlichen Deploy mit den Variablen this.a, this.b und this.c
    }
}

[EDIT]
Genausogut könntest du aber auch Runnable implementieren, dann hättest du noch das extends frei für deine eigenen Vererbungsfeinheiten. Funktioniert aber im Prinizip genauso.

WOW, mein erster EDIT im EDIT-Feld... sieht ja voll abgefahren aus😀[/EDIT]
 
Zuletzt bearbeitet:
Danke schonmal.
Aber wo erzeuge ich die Threads und was für ein RunnableObjekt gebe ich ihnen mit?

Habe es, um bei deinem Bsp. zu bleiben, so probiert (und ging natürlich nicht):
Java:
public class MyClass implements Runnable {
    int a, b, c;
    public void deploy(int a, int b, int c) {
        this.a = a; 
        this.b = b; 
        this.c = c;

        Thread thread = new Thread();
	thread.start();
    }
 
    public void run() {
        // erledige den eigentlichen Deploy mit den Variablen this.a, this.b und this.c
    }
}
 
So richtig funktioniert das doch noch nicht.

Java:
public class MyClass implements Runnable {
    int a, b, c;
    public void deploy(int a, int b, int c) {
        this.a = a; 
        this.b = b; 
        this.c = c;
 
        Thread thread = new Thread(this);
        thread.start();
    }
 
    public void run() {
        // erledige den eigentlichen Deploy mit den Variablen this.a, this.b und this.c
    }
}

Wenn ich deploy nun 2mal mit verschiedenen Werten aufrufe überschreiben sie sich gegenseitig die Werte.
Habe dann mal thread.join(); nach thread.start(); eingefügt. Aber dann läuft das ganze ja wieder sequentiell ab...
 
Ja, weil das über die gleiche Instanz deines Managers läuft... du bräuchtest also zwei Manager, um das so lösen zu können. Tschuldigung, hab ich übersehen...
[EDIT]Du könnest natürlich bei new Thread() auch eine Kopie von this (this.clone()) übergeben, dafür übernehm ich jetzt aber mal keine Garantie... ist nur ´ne fixe Idee, keine Ahnung, ob das überhaupt geht...[/EDIT]
 
Zuletzt bearbeitet:
Aber einen Thread auch im Konstruktor starten? Ist das nicht arg merkwürdig? Korrigiert mich, falls ich falsch liege 🙂
 
Ok, wieder ein Problem gelöst und das nächste gefunden 😉

Wie bekomm ich es hin, dass return erst aufgerufen wird, wenn der der jeweilige thread fertig ist, also run abgearbeitet hat?

Java:
public class MyClass implements Runnable {
    int a, b, c;
    public String deploy(int a, int b, int c) {
        this.a = a; 
        this.b = b; 
        this.c = c;
 
        Thread thread = new Thread(this);
        thread.start();

        return url;
    }
 
    public void run() {
        // erledige den eigentlichen Deploy mit den Variablen this.a, this.b und this.c
       //  schreib irgendwas in url
    }
}
 
Jetzt willst du´s doch wieder sequentiell? Ne, die Funktion deploy soll gar nichts zurückgeben, sondern lediglich die Variablen setzen (dafür wäre dann deploy aber definitiv der falsche Name, das geb ich zu). In der run-Methode kannst du die url als Instanzvariable ansprechen und dort ändern...
 

Zurück
Oben