Threads Threads bestimmte Aufgaben zuweisen...

aquarium1974

Aktives Mitglied
Hallo Leute,

ich wollte was mit Threads machen, weiß aber nicht wie...
Folgendes habe ich gebaut:
- eine Datei erzeugt mit 100 Zahlen, von 0 bis 100


Ich will daß 1 Methode diese Datei zeilenweise ausliest und jeweils die aktuelle Zeile an einen Thread weitergibt und dann einfach so lange wartet.
Also:

Code:
1 Thread wartet 1 Sekunde und nimmt dann die nächste Zeile
2 Thread wartet 2 Sekunde und nimmt dann die nächste Zeile
3 Thread wartet 3 Sekunde und nimmt dann die nächste Zeile
4 Thread wartet 4 Sekunde und nimmt dann die nächste Zeile
5 Thread wartet 5 Sekunde und nimmt dann die nächste Zeile
6 Thread wartet 6 Sekunde und nimmt dann die nächste Zeile
7 Thread wartet 7 Sekunde und nimmt dann die nächste Zeile
8 Thread wartet 8 Sekunde und nimmt dann die nächste Zeile
9 Thread wartet 9 Sekunde und nimmt dann die nächste Zeile
10 Thread wartet 10 Sekunde und nimmt dann die nächste Zeile

Insgesamt sollen 3 Threads das dann abarbeiten. Statt des Wartens könnte das ja auch eine komplexe Rechenoperation sein.
Ich weiß aber nicht wie ich das machen soll.

Ich brauche daß für nichts konkretes, wollte einfach nur mit Threads bischen rumfummeln.

Das habe ich bisher gebaut:

Java:
package thread;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Main {
   static Counter c1;
   static Thread t1;

   public static void main(String[] args) {
     Counter c2 = new Counter(2);
     c1 = new Counter(1);
     t1 = new Thread(c1);
     Counter c3 = new Counter(3);

     Thread t2 = new Thread(c2);
     Thread t3 = new Thread(c3);
//     t1.start();
//     t2.start();
//     t3.start();
     auslesen();
   }

   public static int auslesen() {
     int delay = 0;
     try {
       File f = new File("c://temp/output.txt");
       FileReader fr = new FileReader(f);
       BufferedReader br = new BufferedReader(fr);
       String zeile;
    
       while ((zeile = br.readLine()) != null) {
         System.out.println(Integer.parseInt(zeile));
      
       }

     } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
     }
     return delay;

   }

}

package thread;

public class Counter implements Runnable {
   int nummer;
   int delay;

   public Counter(int nummer) {
     this.nummer = nummer;
   }

   @Override
   public void run() {
     System.out.println("Warte für " + delay + "  Sekunden!");

   }

}
 
Zuletzt bearbeitet von einem Moderator:
Ich würde das mit neuer API lösen und nichts mehr mit Threads. Vereinfacht:
Java:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class Test {
	
	public static void main(String... args) {
		ExecutorService exec = Executors.newFixedThreadPool(3);
		for (int i = 0; i < 20; i++) {
			int n = i;
			exec.execute(() -> {
				try {
					System.out.println(Thread.currentThread().getName() + ": Attempt to sleep: " + n + " seconds.");
					TimeUnit.SECONDS.sleep(n);
				} catch (Exception e) {
					e.printStackTrace();
				}
			});
		}
		exec.shutdown();
	}
}
 
Danke erst mal...
Siehe Kommentar unten im Code.
Kann ich das mit Java7 kompilieren?
Was soll denn der Pfeil im Code?

Mein JDK 1.7 schmeißt einen Compile-Fehler... :-(

Ich würde das mit neuer API lösen und nichts mehr mit Threads. Vereinfacht:
Java:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class Test {
  
    public static void main(String... args) {
        ExecutorService exec = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 20; i++) {
            int n = i;
            exec.execute(() [B]->[/B] { //was soll denn der Pfeil hier? Kann ich das mit Java7 kompilieren?
                try {
                    System.out.println(Thread.currentThread().getName() + ": Attempt to sleep: " + n + " seconds.");
                    TimeUnit.SECONDS.sleep(n);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
        exec.shutdown();
    }
}
 
Ist auch ein Java 8 Programm. Warum immer an so alten Java Versionen hängen bleiben?

Mit Compliance Java 7:
Java:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class Test {
	
	public static void main(String... args) {
		ExecutorService exec = Executors.newFixedThreadPool(3);
		for (int i = 0; i < 20; i++) {
			final int n = i;
			exec.execute(new Runnable() {
				@Override
				public void run() {
					try {
						System.out.println(Thread.currentThread().getName() + ": Attempt to sleep: " + n + " seconds.");
						TimeUnit.SECONDS.sleep(n);
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			});
		}
		exec.shutdown();
	}
}

PS: Das mit den Pfeil ist ein Lambda Ausdruck!
 

Zurück
Oben