public class WS1516Threads { /** Thread zur Berechnung der Summe eines Array-Abschnitts von left bis right, wobei das Ergebnis anschließend (nachdem run fertig ist) mit getSum() abrufbar ist. */ static class Teilberechnung extends Thread { private int sum; private int left, right; private int[] input; public Teilberechnung(int[] array, int left, int right) { // alternativ statt right: Länge des Teilbereiches this.left = left; this.right = right; input = array; } public void run() { sum = 0; for (int i = left; i <= right; i++) sum += input[i]; // Summe fertig berechnet } public int getSum() { return sum; } } public static int sum(int[] input, int numThreads) { Teilberechnung[] t = new Teilberechnung[numThreads]; // Erzeuge (numThreads-1) viele Threads mit der Größe floor(input.length/numThreads) int laenge = input.length/numThreads; int left = 0; for (int i = 0; i < numThreads-1; i++) { t[i] = new Teilberechnung(input, left, left+laenge-1); left += laenge; t[i].start(); } // Erzeuge letzten Thread mit der Größe des verbleibenden Bereichs t[numThreads-1] = new Teilberechnung(input, left, input.length-1); t[numThreads-1].start(); int gesamtsumme = 0; for (Teilberechnung tb : t) { try { tb.join(); } catch (InterruptedException e) {} gesamtsumme += tb.getSum(); } return gesamtsumme; } public static void main(String[] args) { System.out.println(sum(new int[] {2, 7, 3, 9, 0, -3, 4, 4, 1}, 4)); } }