/////// Critical.java /////// class MyLock { } class FindMin extends Thread { public FindMin(int[] ar, int l, int h) { arr = ar; low = l+1; high = h; l_min = arr[l]; } public void run() { try { while ( low < high ) { int n = Math.min(incr, high-low); for (int i=low; i <= low+n; i++) l_min = Math.min(l_min, arr[i]); sleep(5); low += n; } } catch(InterruptedException e) { return ; } synchronized ( MinTest.lock ) { MinTest.min = Math.min(MinTest.min, l_min); } } private int l_min; // local minimum private int low, high; // array range private int incr = 10; // increment private int[] arr; // array ref } class MinTest { public static void main(String[] args) throws InterruptedException { int[] a = new int[1024]; for (int i=0; i < 1024; i++) a[i] = (int) (100000*Math.random()); int nt=0; if ( args.length == 1 ) nt = Integer.valueOf(args[0]).intValue(); if ( nt <= 0 ) nt = 4; lock = new MyLock(); min = a[0]; FindMin[] slave = new FindMin[nt]; int range = 1024/nt; int high, low = 0; for (int i=0; i < nt-1; i++) { high = low + range -1; slave[i] = new FindMin(a, low, high); low = high + 1; } slave[nt-1] = new FindMin(a, low, 1023); for (int i=0; i < nt; i++) slave[i].start(); for (int i=0; i < nt; i++) slave[i].join(); System.out.println("Minimum = " + min); } public static MyLock lock; public static int min; }