import java.util.Random; import java.util.concurrent.Semaphore; import static mk.ukim.finki.os.synchronization.exam17.s3.g1.Reader.lock; public class Reader extends Thread { public static Random random = new Random(); public static Semaphore lock = new Semaphore(1); public static Semaphore signal = new Semaphore(0); public static void main(String[] args) throws InterruptedException { // TODO: kreirajte Reader i startuvajte go negovoto pozadinsko izvrsuvanje Reader reader = new Reader(); reader.start(); for (int i = 0; i < 100; i++) { Writer writer = new Writer(); //TODO: startuvajte go writer-ot writer.start(); } // TODO: Cekajte 10000ms za Reader-ot da zavrsi reader.join(10_000); // TODO: ispisete go statusot od izvrsuvanjeto if (reader.isAlive()) { System.out.println("reader will be interrupted"); reader.interrupt(); } else { System.out.println("reader is done"); } } /** * Ne smee da bide izvrsuva paralelno so write() metodot */ public static void read() { System.out.println("reading"); } public void run() { int pendingReading = 100; while (pendingReading > 0) { pendingReading--; try { // TODO: cekanje na nov zapisan podatok signal.acquire(); lock.acquire(); // TODO: read() metodot ne smee da se izvrsuva paralelno so write() od Writer klasata read(); lock.release(); } catch (InterruptedException e) { e.printStackTrace(); break; } } System.out.println("Done scheduling!"); } } class Writer extends Thread { public Integer duration; public Writer() throws InterruptedException { this.duration = Reader.random.nextInt(1000); } /** * Ne smee da bide povikan paralelno */ public static void write() { System.out.println("writting"); } @Override public void run() { try { Thread.sleep(this.duration); lock.acquire(); write(); lock.release(); Reader.signal.release(); } catch (InterruptedException e) { e.printStackTrace(); } } }