Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo Leute,
ich soll in einer Klasse 4 Threads erstellen, denen ich dann verschiedene Aufgaben zuweise. Im Internet finde ich zum Thema Threads nur Beispiele, bei denen weitere Klassen erstellt werden. Meine Frage: Wie weise ich einem Thread innerhalb einer Klasse eine bestimmte Aufgabe zu?
Wenn ich das richtig verstehe, willst du einfach anynome Runnable Objekte erzeugen, die jeweils deine gewünschte Aufgabe ausführen, und damit dann den Thread starten:
Java:
public class Test {
public static void main(String[] args) throws InterruptedException {
Test t = new Test();
t.testThreads();
}
void testThreads() throws InterruptedException {
Runnable r1 = () -> printNumbers(0, 10);
Runnable r2 = () -> printNumbers(10, 20);
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("Alle Threads beendet");
}
void printNumbers(int from, int to) {
for (int i = from; i < to; i++) {
System.out.println(Thread.currentThread().getName() +": "+ i);
}
}
}
#Edit:
Wenn man mit Threads arbeitet, bietet es sich aber generell an einen Threadpool zu nutzen, um nicht alle Threads händisch zu verwalten etc.
Also:
Java:
void testThreadpool() throws InterruptedException {
ExecutorService pool = Executors.newFixedThreadPool(4);
for (int i = 0; i < 4; i++) {
final int start = i;
Runnable r = () -> printNumbers(start * 10, start * 10 + 10);
pool.submit(r);
}
pool.shutdown();
pool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
}
Über Callables lässt sich dann auch mit Rückgabewerten arbeiten, falls das gewünscht ist.
Danke für deine Antwort. Ich habe es jetzt folgendermaßen gelöst:
Java:
class Threadtest{
public void methode1(){
...}
public void methode2(){
...}
class Thread1 extends Thread{
public void run(){
methode1();
}
}
class Thread2 extends Thread{
public void run(){
methode2();
}
}
public void methode3(){
Thread1 a = new Thread1();
Thread2 b = new Thread2();
a.start();
b.start();
usw...
}
}
Das funktioniert bei mir auch. Ist das auch richtig?
Vielen Dank! In einem Fall bräuchte ich nochmal Hilfe. Und zwar habe ich auf die obige Art und Weise vier Threads erstellt. Jeder der Threads übernimmt eine andere Aufgabe/Methode. Die vier Threads werden gestartet und nun möchte es so timen, dass es erst weiter im Programmcode geht, wenn jeder der vier Threads seine Methode ausgeführt hat.
Wie stelle ich sicher, dass alle vier Threads ihre Aufgaben vollständig ausgeführt haben?
Geht das mit Thread.join()?
Danke im Voraus!
OKay aber er wirft mir dann die folgende Exception:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
Er meint die Zeile in der ich Thread1.start();
ausführe. Allerdings sehe ich da keinen Fehler.
ZUr Information: Ich führe die Threads in einer Schleife aus. Ich starte die Threads alle innerhalb der Schleife und "joine" sie auch wieder in der Schleife. Das müsste doch legitim sein aber wo ist dann der Fehler?
OKay aber er wirft mir dann die folgende Exception:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
Er meint die Zeile in der ich Thread1.start();
ausführe. Allerdings sehe ich da keinen Fehler.
ZUr Information: Ich führe die Threads in einer Schleife aus. Ich starte die Threads alle innerhalb der Schleife und "joine" sie auch wieder in der Schleife. Das müsste doch legitim sein aber wo ist dann der Fehler?
Du versuchst vermutlich mehrfach die start-Methode aufzurufen. Wenn ein Thread einmal beendet wurde, kann man den aber nicht nochmal starten. Also entweder neuen Thread erstellen oder gleich einen Threadpool benutzen, dann hat man das Problem auch nicht.