import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class MinstC { public static void main(String[ ] args) { new MinstC(); } int [ ] tabell; MinstMonitorC monitor; Runnable runAbl; public MinstC ( ) { tabell = new int[6400000]; for (int in = 0; in< 6400000; in++) tabell[in] = (int)Math.round(Math.random()* Integer.MAX_VALUE); monitor = new MinstMonitorC(); for (int i = 0; i< 64; i++) { runAbl = new MinstTradC(tabell,i*100000,((i+1)*100000)-1,monitor); new Thread(runAbl).start(); } monitor.vent(); // Main-traden venter paa alle de andre System.out.println("Minste verdi var: " + monitor.hentMinste()); } } class MinstMonitorC { private Lock laas = new ReentrantLock(); private Condition alleFerdige = laas.newCondition(); int minstTilNa = Integer.MAX_VALUE; int antallFerdigeSubtrader = 0; public void vent() { laas.lock(); try { while (antallFerdigeSubtrader != 64) { alleFerdige.await(); System.out.println(antallFerdigeSubtrader + " ferdige subtrader "); } // antall ferdige subtrader = 64 } catch (InterruptedException e) { System.out.println(" Uventet avbrudd "); System.exit(0); } finally { laas.unlock(); } } public void giMinsteVerdi (int minVerdi) { laas.lock(); try { antallFerdigeSubtrader ++; if(minstTilNa > minVerdi) minstTilNa = minVerdi; if(antallFerdigeSubtrader == 64) alleFerdige.signal(); } finally { laas.unlock(); } } public int hentMinste () { //Trenger ikke laases, kalles etter alle andre return minstTilNa; } } class MinstTradC implements Runnable { int [ ] tab; int startInd, endInd; MinstMonitorC mon; MinstTradC(int [ ] tb, int st, int en, MinstMonitorC m) { tab = tb; startInd = st; endInd = en; mon = m; } 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); } }