2017-01-06 49 views
-3

Für unsere Aufgabe für die Klasse starten, müssen wir die Menge der Wörter in einer txt-Datei, indem er Segmente in n Aufspaltung zählen, die wir das Programm vor dem Start einstellen sollen in der Lage sein. Jedes Segment sollte dann einen eigenen Thread bekommen, der die Wörter zählt und dann stoppt. Am Ende sollte der Haupt-Thread alle einzelnen Wortzählungen sammeln und sie zusammenfügen.mehrere Threads gleichzeitig

Dies ist (Teil), was ich bisher

for (int i = 0; i < segments; i++){ 
      Thread thread = new Thread(); 
      thread.start(); 
      int words = counting(stringarray[i]); 
      totalwords += words; 
      long nanos = ManagementFactory.getThreadMXBean().getThreadCpuTime(Thread.currentThread().getId()); 
      System.out.println("This Thread read " + words + " words. The total word count now is " + totalwords + 
        ". The time it took to finish for this thread is " + nanos +"."); 
      System.out.println("Number of active threads from the given thread: " + Thread.activeCount()); 
     } 

Jetzt schrieb, während dies getan, um die primäre Aufgabe bekommt (die Wörter in verschiedenen Threads zu zählen und sie auf die Gesamt Zugabe), ich weiß nicht, wie um einfach "den Thread verlassen zu lassen" und dann die einzelnen Wordcounts zu addieren, nachdem jeder Thread seine Aufgabe erledigt hat.

Zusätzlich kann, während dies auf jeden Fall mehrere Threads starten wird, druckt es immer nur, dass ich 2 oder vielleicht 3 Fäden zu einem Zeitpunkt ausgeführt wird, auch wenn ich die txt in 100 Segmente aufgeteilt. Gibt es eine Möglichkeit, sie alle gleichzeitig laufen zu lassen?

+2

Ihre Threads tun nichts. Wahrscheinlich möchten Sie [hier] (https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html) starten. – shmosel

+0

'Thread thread = neuer Thread(); thread.start(); 'tut eigentlich nichts - der von Ihnen erstellte Thread hat kein lauffähiges Ziel. – Mshnik

+0

Wusste es könnte nicht so einfach sein. Ich werde es lesen, wenn es nicht 4 Uhr morgens ist. –

Antwort

0

Sie können das nächste Code-Snippet als Grundlage verwenden. Beachten Sie, dass für den Fall, dass Sie die allgemeine Variable in verschiedenen Threads erhöhen, diese Operation Thread-sicher sein muss. Deshalb AtomicInteger Variable als Zähler verwendet wird

final List<String> segments = new ArrayList<>(); 
//TODO:Fill segments ... this is up to you 
//In case threads will increment same variable it has to be thread-safe 
final AtomicInteger worldCount = new AtomicInteger(); 
//Create Thread for each segment (this is definitely not optimal) 
List<Thread> workers = new ArrayList<>(segments.size()); 
for (int i = 0; i < segments.size(); i++) { 
    final String segment = segments.get(i); 
    Thread worker = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      //increment worldCount 
      worldCount.addAndGet(counting(segment)); 
     } 
    }); 
    workers.add(worker); 
    worker.start(); 
} 

//Wait until all Threads are finished 
for (Thread worker : workers) { 
    worker.join(); 
} 
int result = worldCount.get(); 
1

Der Wortlaut der Frage legen nahe, dass jeder Thread einen eigenen Zähler hat, so würde ich einen Thread-Klasse deklarieren:

public class WordCounter extends Thread { 
    private String text; 
    private int count; 

    public WordCounter(String text) { 
     this.text = text; 
    } 

    public int getCount() { 
     return count; 
    } 

    @Override 
    public void run() { 
     count = counting(text); 
    } 
} 

und es verwenden, wie folgt :

WordCounter[] threads = new WordCounter[segments]; 
for (int i = 0; i < segments; ++i) { 
    threads[i] = new WordCounter(stringarray[i]); 
    threads[i].start(); 
} 
int total = 0; 
for (int i = 0; i < segments; ++i) { 
    threads[i].join(); 
    total += threads[i].getCount(); 
} 
+0

Danke! Das macht jetzt so viel Sinn. Genau das, was ich zu tun versuchte. –

0

Gleiche Lösungen, aber mit Testamentsvollstrecker:

final List<String> segments = new ArrayList<>(); 
    segments.add("seg1"); 
    segments.add("seg2"); 
    segments.add("seg 3"); 

    final AtomicInteger worldCount = new AtomicInteger(); 

    List<Future> workers = new ArrayList<>(segments.size()); 
    ExecutorService executor = Executors.newFixedThreadPool(segments.size()); 
    for (String segment : segments) { 
     Future<Integer> worker = executor.submit(() -> worldCount.addAndGet(counting(segment))); 
     workers.add(worker); 
    } 

    executor.shutdown(); 
    if (!executor.awaitTermination(5, TimeUnit.SECONDS)) { 
     System.out.println("Still waiting..."); 
     System.exit(0); 
    } 

    int result = worldCount.get(); 

    System.out.println("result = " + result); 
Verwandte Themen