/////// MaxGurad.java /////// class MaxGuard { public MaxGuard(int e) { maxValue = e; } public synchronized int getMax() { return maxValue; } public synchronized void setMax(int e) { maxValue = Math.max(maxValue, e); } private int maxValue; } class FindMax extends Thread { public FindMax(int[] ar, int l, int h, MaxGuard m) { arr = ar; low = l+1; high = h; l_max = arr[l]; xobj = m; } public void run() { try { while ( low < high ) { int n = Math.min(incr, high-low); for (int i=low; i <= low+n; i++) l_max = Math.max(l_max, arr[i]); // (1) sleep(5); low += n; } } catch(InterruptedException e) { return ; } xobj.setMax(l_max); // (2) } private int l_max; // local maximum private int low, high; // array range private int incr = 10; // increment private int[] arr; // array ref private MaxGuard xobj; // mutex object } class MaxTest { public static void main(String[] args) throws InterruptedException { int[] a = new int[1024]; for (int i=0; i < 1024; i++) // (A) a[i] = (int) (100000*Math.random()); int nt=0; if ( args.length == 1 ) nt = Integer.valueOf(args[0]).intValue(); if ( nt <= 0 ) nt = 4; // (B) MaxGuard ans = new MaxGuard(a[0]); FindMax[] slave = new FindMax[nt]; int range = 1024/nt; // (C) int high, low = 0; for (int i=0; i < nt-1; i++) { high = low + range -1; slave[i] = new FindMax(a, low, high, ans); // (D) low = high + 1; } slave[nt-1] = new FindMax(a, low, 1023, ans); for (int i=0; i < nt; i++) slave[i].start(); // (E) for (int i=0; i < nt; i++) slave[i].join(); System.out.println("Maximum = " + ans.getMax()); } }