import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.CountDownLatch; public class MinstCB { public static void main(String[ ] args) { new MinstCB(); } int [ ] tabell; MinstMonitorCB monitor; Runnable runAbl; final int antallTrader = 64; CountDownLatch bariere = new CountDownLatch(antallTrader); public MinstCB ( ) { tabell = new int[6400000]; for (int in = 0; in< 6400000; in++) { tabell[in] = (int)Math.round(Math.random()* Integer.MAX_VALUE); } monitor = new MinstMonitorCB(); for (int i = 0; i< 64; i++) { runAbl = new MinstTradCB(tabell,i*100000,((i+1)*100000)-1,monitor,bariere); new Thread(runAbl).start(); } try { bariere.await(); System.out.println("Minste verdi var: " + monitor.hentMinste()); } catch (InterruptedException ex){ System.out.println(" Uventet avbrudd "); System.exit(0); } } } class MinstMonitorCB { private Lock laas = new ReentrantLock(); int minstTilNa = Integer.MAX_VALUE; int antallFerdigeSubtrader = 0; public void giMinsteVerdi (int minVerdi) { laas.lock(); try { if(minstTilNa > minVerdi) minstTilNa = minVerdi; } finally { laas.unlock(); } } public int hentMinste () {return minstTilNa;} //Trenger ikke laases // fordi alle andre operasjoner er ferdige } class MinstTradCB implements Runnable { int [ ] tab; int startInd, endInd; MinstMonitorCB mon; CountDownLatch bariere; MinstTradCB(int [ ] tb, int st, int en, MinstMonitorCB m, CountDownLatch bariere) { tab = tb; startInd = st; endInd = en; mon = m; this.bariere = bariere; } public void run(){ int minVerdi = Integer.MAX_VALUE; for (int ind = startInd; ind <= endInd; ind++) { if(tab[ind] < minVerdi) minVerdi = tab[ind]; } mon.giMinsteVerdi(minVerdi); bariere.countDown(); } }