class calculate implements Runnable { private int index, jump; private long num_rects; private double width, mid, height; public double sum; public calculate(long num_rects, int index, int jump) { this.num_rects = num_rects; this.index = index; this.jump = jump; this.width = 1.0/(double)num_rects; } public void run() { for (int i = index; i < num_rects; i += jump) { mid = (i + 0.5) * width; height = 4.0/(1.0 + mid*mid); sum += height; } } } public class pi_threaded { private static long num_rects = 1000000000; private static double width = 1.0/(double)num_rects; public static void main(String[] args) { double sum = 0.0; double area = 0.0; int n = 8; calculate[] calculators = new calculate[n]; Thread[] threads = new Thread[n]; for (int i = 0; i < n; i++) { calculators[i] = new calculate(num_rects, i, 8); threads[i] = new Thread(calculators[i]); threads[i].start(); } for (int i = 0; i < n; i++) { try { threads[i].join(); sum += calculators[i].sum; } catch (Exception ex) { ex.printStackTrace(); } } area = width * sum; System.out.println("Computed pi = " + area); } }