<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sr">
	<id>https://siwiki.rs/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mf230002d</id>
	<title>SI Wiki - Кориснички доприноси [sr]</title>
	<link rel="self" type="application/atom+xml" href="https://siwiki.rs/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mf230002d"/>
	<link rel="alternate" type="text/html" href="https://siwiki.rs/wiki/%D0%9F%D0%BE%D1%81%D0%B5%D0%B1%D0%BD%D0%BE:%D0%94%D0%BE%D0%BF%D1%80%D0%B8%D0%BD%D0%BE%D1%81%D0%B8/Mf230002d"/>
	<updated>2026-06-04T02:29:47Z</updated>
	<subtitle>Кориснички доприноси</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%9B%D0%B0%D0%B1_1_2024&amp;diff=8379</id>
		<title>КДП/Лаб 1 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%9B%D0%B0%D0%B1_1_2024&amp;diff=8379"/>
		<updated>2026-06-01T19:52:41Z</updated>

		<summary type="html">&lt;p&gt;Mf230002d: /* Решење за Child Care */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Прва лабораторијска вежба 2024. године&#039;&#039;&#039; одржана је 29. i 30. априла и носила је 10 бодова (3 бода Moodle 7 бодова задатак). Укупно је било 4 групе. &lt;br /&gt;
&lt;br /&gt;
== Улазни тест Група 1 и 2 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Уколико нит А позове a(), а нит Б позове b(), шта ће се десити са нити Б?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class A {&lt;br /&gt;
	public synchronized void a() {&lt;br /&gt;
		//neki kod ...&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public synchronized void b() {&lt;br /&gt;
		//neki kod..&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	A obj = new A();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одговор: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Зауставиће се док се не изврши a()&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
&lt;br /&gt;
Који од следећег су валидни начини да се иницијализује нит?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;Runnable r = new Runnable() {&lt;br /&gt;
	    public void run(){ /*neki kod*/ }&lt;br /&gt;
	};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Runnable r = new Runnable() {&lt;br /&gt;
		public void run(){ /*neki kod*/}&lt;br /&gt;
	};&lt;br /&gt;
Thread t = new Thread(r);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Thread t = new Thread();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;public class Nit extends Thread {&lt;br /&gt;
	public void run(){ /*neki kod*/ }&lt;br /&gt;
}&lt;br /&gt;
Nit t = new Nit();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Thread t = new Thread() {&lt;br /&gt;
	public void run(){ /*neki kod*/ }&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
&lt;br /&gt;
Прва нит извршава &amp;lt;code&amp;gt;readMethod()&amp;lt;/code&amp;gt; и закључала је &amp;lt;code&amp;gt;readLock&amp;lt;/code&amp;gt;. Друга нит је позвала &amp;lt;code&amp;gt;writeMethod()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class LockExample {&lt;br /&gt;
    private static final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();&lt;br /&gt;
&lt;br /&gt;
    public void readMethod() {&lt;br /&gt;
        rwLock.readLock().lock();&lt;br /&gt;
        try {&lt;br /&gt;
            // Neki kod...&lt;br /&gt;
        } finally {&lt;br /&gt;
            rwLock.readLock().unlock();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void writeMethod() {&lt;br /&gt;
        if (!rwLock.isWriteLocked()) {&lt;br /&gt;
            rwLock.writeLock().lock();&lt;br /&gt;
            try {&lt;br /&gt;
                // Neki kod..&lt;br /&gt;
            } finally {&lt;br /&gt;
                rwLock.writeLock().unlock();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чему служи параметар у конструктору &amp;lt;code&amp;gt;ReentrantReadWriteLock&amp;lt;/code&amp;gt;?&lt;br /&gt;
Одговор: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;FIFO Fairness&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шта се дешава са другом нити?&lt;br /&gt;
Одговор: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Блокира се на &amp;lt;code&amp;gt;writeLock&amp;lt;/code&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Улазни тест Групe 3 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Када нит T увек трајно престаје да се извршава?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# Када нит позове wait над неким објектом.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Када се заврши њена run метода.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Када позове своју interrupt методу.&lt;br /&gt;
# Ниједан од понуђених одговора.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
&lt;br /&gt;
Који од наведених исказа су тачни?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&amp;lt;code&amp;gt;ArrayBlockingQueue&amp;lt;/code&amp;gt; je pogodan za rešavanje ProducerConsumer problema.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;add(E e) i remove()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingQueue&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;putFirst(E e) i takeLast()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingDeque&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;transfer(E e) i take()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;TransferQueue&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;putFirst(E e) i takeFirst()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingDeque&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
&lt;br /&gt;
Уколико нит threadA тренутно извршава методу обј.а(), а потом нит threadB позива методу обј.б(), који од понуђених одговора су тачни, уколико је дат следећи део кода?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class A {&lt;br /&gt;
  private ReentrantReadWriteLock rw = new ReentrantReadWriteLock(true);&lt;br /&gt;
&lt;br /&gt;
  public void a() {&lt;br /&gt;
    try {&lt;br /&gt;
      rw.readLock().lock();&lt;br /&gt;
      // kritična sekcija A...  // &amp;lt;- threadA&lt;br /&gt;
    } finally {&lt;br /&gt;
      rw.readLock().unlock();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public void b() {&lt;br /&gt;
    try {&lt;br /&gt;
      if (rw.getReadLockCount()==0) {&lt;br /&gt;
        rw.writeLock().lock();&lt;br /&gt;
      }&lt;br /&gt;
      // kritična sekcija B...&lt;br /&gt;
    } finally {&lt;br /&gt;
      rw.writeLock().unlock();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
A obj = new A();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; Десиће се грешка приликом извршавања.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Аргумент конструктора ReentrantReadWriteLock означава да могу две нити истовремено да позивају закључавање.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Нити А и Б могу истовремено да извршавају критичне секције у методама a() и b() (респективно).&amp;lt;/span&amp;gt;&lt;br /&gt;
# Нит Б ће бити блокирана док нит А не заврши позив методе a().&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Аргумент конструктора ReentrantReadWriteLock означава да ли ће се буђење нити обављати по FIFO принципу.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Нит Б неће извршити закључавање, јер услов if-a није испуњен.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Улазни тест Групe 4 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
&lt;br /&gt;
Који од следећег су валидни начини да се иницијализује нит?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;Runnable r = new Runnable() {&lt;br /&gt;
	    public void run(){ /*neki kod*/ }&lt;br /&gt;
	};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Runnable r = new Runnable() {&lt;br /&gt;
		public void run(){ /*neki kod*/}&lt;br /&gt;
	};&lt;br /&gt;
Thread t = new Thread(r);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Thread t = new Thread();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;public class Nit extends Thread {&lt;br /&gt;
	public void run(){ /*neki kod*/ }&lt;br /&gt;
}&lt;br /&gt;
Nit t = new Nit();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Thread t = new Thread() {&lt;br /&gt;
	public void run(){ /*neki kod*/ }&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
&lt;br /&gt;
Који од наведених исказа су тачни?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&amp;lt;code&amp;gt;ArrayBlockingQueue&amp;lt;/code&amp;gt; je pogodan za rešavanje ProducerConsumer problema.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;add(E e) i remove()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingQueue&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;putFirst(E e) i takeLast()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingDeque&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;transfer(E e) i take()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;TransferQueue&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;putFirst(E e) i takeFirst()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingDeque&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
&lt;br /&gt;
Како правилно осигурати међусобно искључивање критичне секције?&lt;br /&gt;
&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Поставка Свих Група==&lt;br /&gt;
&lt;br /&gt;
У зависности од групе било је потребно решити један од следећих проблема:&lt;br /&gt;
&lt;br /&gt;
1. Решити &amp;lt;code&amp;gt;Atomic Broadcast&amp;lt;/code&amp;gt; проблем користећи &amp;lt;code&amp;gt;AtomicInteger&amp;lt;/code&amp;gt; и опционо &amp;lt;code&amp;gt;Semaphore&amp;lt;/code&amp;gt; . Бафер садржи B елемената. Потребно је да програм буде максимално конкурентан и отпоран на прекиде.&lt;br /&gt;
&lt;br /&gt;
2. Решити &amp;lt;code&amp;gt;H2O&amp;lt;/code&amp;gt; проблем користећи &amp;lt;code&amp;gt;CyclicBarrier&amp;lt;/code&amp;gt;. Потребно је да програм буде максимално конкурентан и отпоран на прекиде.&lt;br /&gt;
&lt;br /&gt;
3. Решити &amp;lt;code&amp;gt;Dining Philosophers&amp;lt;/code&amp;gt; проблем користећи &amp;lt;code&amp;gt;AtomicInteger&amp;lt;/code&amp;gt; и регионе. филозофи који су раније изразили жељу за храном треба раније да буду опслужени . Потребно је да програм буде максимално конкурентан и отпоран на прекиде.&lt;br /&gt;
&lt;br /&gt;
4. Решити &amp;lt;code&amp;gt;Child Care&amp;lt;/code&amp;gt; проблем користећи &amp;lt;code&amp;gt;ConcurrentLinkedQueue&amp;lt;/code&amp;gt; и друге произвољне синхронизационе директиве. Родитељ доводи једно или више деце у обданиште и чека све док се не појави место, како би оставио сву децу одједном и отишао. Родитељ може и да одведе једно или више деце, такође одједном. Мора се поштовати редослед доласка родитеља који остављају децу и васпитачица које одлазе са посла. Потребно је да програм буде максимално конкурентан и отпоран на прекиде.&lt;br /&gt;
&lt;br /&gt;
== Решење за Atomic Broadcast ==&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G1;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
&lt;br /&gt;
	private static final int consumersCount=3;&lt;br /&gt;
	private static final int b=5;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
		AtomicInteger[][] reads = new AtomicInteger[b][consumersCount];&lt;br /&gt;
&lt;br /&gt;
		Semaphore mutex = new Semaphore(1);&lt;br /&gt;
&lt;br /&gt;
		AtomicInteger[] buffer = new AtomicInteger[b];&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; buffer.length; i++)&lt;br /&gt;
			buffer[i] = new AtomicInteger(0);&lt;br /&gt;
&lt;br /&gt;
		Consumer[] consumers = new Consumer[consumersCount];&lt;br /&gt;
&lt;br /&gt;
		Producer p = new Producer(consumersCount, buffer, reads,b,mutex);&lt;br /&gt;
		p.start();&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; b; i++)&lt;br /&gt;
			for(int j=0;j&amp;lt;consumersCount;j++)&lt;br /&gt;
				reads[i][j] = new AtomicInteger(1);&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; consumersCount; i++) {&lt;br /&gt;
			consumers[i] = new Consumer(buffer, reads,b,mutex,i);&lt;br /&gt;
			consumers[i].start();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Producer.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G1;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Producer extends Thread {&lt;br /&gt;
&lt;br /&gt;
	private final int consumers;&lt;br /&gt;
	private AtomicInteger[] buffer;&lt;br /&gt;
	private AtomicInteger[][] reads;&lt;br /&gt;
	private Semaphore mutex;&lt;br /&gt;
	private int b;&lt;br /&gt;
&lt;br /&gt;
	public Producer(int consumers, AtomicInteger[] buffer, AtomicInteger[][] reads, int bb, Semaphore mutex) {&lt;br /&gt;
		this.consumers = consumers;&lt;br /&gt;
		this.buffer = buffer;&lt;br /&gt;
		this.reads = reads;&lt;br /&gt;
		b=bb;&lt;br /&gt;
		this.mutex = mutex;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		for (int i = 0; i &amp;lt;b; i++) {&lt;br /&gt;
			for (int j = 0; j &amp;lt; consumers; j++)&lt;br /&gt;
				while(reads[i][j].get() == 0)&lt;br /&gt;
					Thread.onSpinWait();&lt;br /&gt;
&lt;br /&gt;
			int rand = (int)(Math.random() * 10);&lt;br /&gt;
			System.out.println(&amp;quot;Producer produced element: &amp;quot; + rand );&lt;br /&gt;
			mutex.acquireUninterruptibly();&lt;br /&gt;
			buffer[i].set(rand);&lt;br /&gt;
			mutex.release();&lt;br /&gt;
&lt;br /&gt;
			mutex.acquireUninterruptibly();&lt;br /&gt;
			for (int j2 = 0; j2 &amp;lt; consumers; j2++)&lt;br /&gt;
				reads[i][j2].set(0);&lt;br /&gt;
&lt;br /&gt;
			mutex.release();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Consumer.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G1;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Consumer extends Thread {&lt;br /&gt;
&lt;br /&gt;
	private int id;&lt;br /&gt;
	private AtomicInteger[][] reads;&lt;br /&gt;
	private AtomicInteger[] buffer;&lt;br /&gt;
	private Semaphore mutex;&lt;br /&gt;
	private int b;&lt;br /&gt;
&lt;br /&gt;
	public Consumer(AtomicInteger[] buff, AtomicInteger[][] r, int bb,Semaphore mutex, int i) {&lt;br /&gt;
		buffer = buff;&lt;br /&gt;
		reads=r;&lt;br /&gt;
		id=i;&lt;br /&gt;
		this.mutex = mutex;&lt;br /&gt;
		b=bb;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		for (int i = 0; i &amp;lt; b; i++) {&lt;br /&gt;
			while(reads[i][id].get() == 1)&lt;br /&gt;
				Thread.onSpinWait();&lt;br /&gt;
			mutex.acquireUninterruptibly();&lt;br /&gt;
			int elem = buffer[i].get();&lt;br /&gt;
			System.out.println(&amp;quot;Consumer &amp;quot;+id+&amp;quot; consumed element &amp;quot;+elem +&amp;quot;from place &amp;quot;+i);&lt;br /&gt;
			reads[i][id].set(1);&lt;br /&gt;
			mutex.release();&lt;br /&gt;
&lt;br /&gt;
			try {&lt;br /&gt;
				sleep((int)(Math.random()*2000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				throw new RuntimeException(e);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решење за H2O ==&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package H20;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.CyclicBarrier;&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
		int cnt = 10;&lt;br /&gt;
		&lt;br /&gt;
		Barrier barrier = new Barrier(new CyclicBarrier(3));&lt;br /&gt;
		&lt;br /&gt;
		Hydrogen[] h = new Hydrogen[cnt*2];&lt;br /&gt;
		Oxygen[] o = new Oxygen[cnt];&lt;br /&gt;
		&lt;br /&gt;
		for(int i = 0; i &amp;lt; cnt; i++) {&lt;br /&gt;
			o[i] = new Oxygen(barrier);&lt;br /&gt;
			h[2*i] = new Hydrogen(barrier);	&lt;br /&gt;
			h[2*i + 1] = new Hydrogen(barrier);	&lt;br /&gt;
			&lt;br /&gt;
			o[i].start();&lt;br /&gt;
			h[2*i].start();&lt;br /&gt;
			h[2*i+1].start();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;Oxygen.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package H20;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.BrokenBarrierException;&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
&lt;br /&gt;
public class Oxygen extends Thread {&lt;br /&gt;
	&lt;br /&gt;
	Barrier barrier;&lt;br /&gt;
	&lt;br /&gt;
	Oxygen(Barrier b){&lt;br /&gt;
		barrier = b;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep((int)(Math.random() * 4000));&lt;br /&gt;
			} catch (InterruptedException e) {}&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			barrier.oxygen.acquireUninterruptibly();&lt;br /&gt;
&lt;br /&gt;
			barrier.oCount++;&lt;br /&gt;
			&lt;br /&gt;
			try {&lt;br /&gt;
				System.out.println(&amp;quot;Kiseonik pristigao na barijeru&amp;quot;);&lt;br /&gt;
				&lt;br /&gt;
				if(barrier.barrier.await() == 0) {&lt;br /&gt;
					System.out.println(&amp;quot;\nFORMIRANJE VODE!\n&amp;quot;);&lt;br /&gt;
					&lt;br /&gt;
					barrier.hCount = 0;&lt;br /&gt;
					barrier.oCount = 1;&lt;br /&gt;
					&lt;br /&gt;
					barrier.hydrogen.release(2);&lt;br /&gt;
					barrier.oxygen.release(1);&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
			} catch (InterruptedException | BrokenBarrierException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Hydrogen.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package H20;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.BrokenBarrierException;&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
&lt;br /&gt;
public class Hydrogen extends Thread {&lt;br /&gt;
	&lt;br /&gt;
	Barrier barrier;&lt;br /&gt;
	&lt;br /&gt;
	Hydrogen(Barrier b){&lt;br /&gt;
		barrier = b;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep((int)(Math.random() * 4000));&lt;br /&gt;
			} catch (InterruptedException e) {}&lt;br /&gt;
			&lt;br /&gt;
			barrier.hydrogen.acquireUninterruptibly();&lt;br /&gt;
&lt;br /&gt;
			barrier.hCount++;&lt;br /&gt;
			&lt;br /&gt;
			try {&lt;br /&gt;
				System.out.println(&amp;quot;Vodonik pristigao na barijeru&amp;quot;);&lt;br /&gt;
				&lt;br /&gt;
				if(barrier.barrier.await() == 0) {&lt;br /&gt;
					System.out.println(&amp;quot;\nFORMIRANJE VODE!\n&amp;quot;);&lt;br /&gt;
					barrier.hCount = 0;&lt;br /&gt;
					barrier.oCount = 1;&lt;br /&gt;
					&lt;br /&gt;
					barrier.hydrogen.release(2);&lt;br /&gt;
					barrier.oxygen.release(1);&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
			} catch (InterruptedException | BrokenBarrierException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Barrier.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package H20;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.CyclicBarrier;&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
&lt;br /&gt;
public class Barrier {&lt;br /&gt;
	CyclicBarrier barrier;&lt;br /&gt;
	Semaphore hydrogen, oxygen;&lt;br /&gt;
	int hCount, oCount;&lt;br /&gt;
	&lt;br /&gt;
	Barrier(CyclicBarrier cb){&lt;br /&gt;
		barrier = cb;&lt;br /&gt;
		hCount = 0;&lt;br /&gt;
		oCount = 0;&lt;br /&gt;
		hydrogen = new Semaphore(2);&lt;br /&gt;
		oxygen = new Semaphore(1);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решење за Dining Philosophers ==&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G3;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
&lt;br /&gt;
	public static final int N = 5;&lt;br /&gt;
&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
		Philosopher[] philosophers = new Philosopher[N];&lt;br /&gt;
		AtomicInteger[] forks = new AtomicInteger[N];&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; forks.length; i++)&lt;br /&gt;
			forks[i] = new AtomicInteger(1);&lt;br /&gt;
&lt;br /&gt;
		Table table = new Table();&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
			philosophers[i] = new Philosopher(forks, i, N, table);&lt;br /&gt;
			philosophers[i].start();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;Table.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G3;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Table {&lt;br /&gt;
&lt;br /&gt;
	AtomicInteger ticket;&lt;br /&gt;
	int next;&lt;br /&gt;
&lt;br /&gt;
	public Table() {&lt;br /&gt;
		ticket = new AtomicInteger(0);&lt;br /&gt;
		next = 0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Philosopher.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G3;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Philosopher extends Thread {&lt;br /&gt;
&lt;br /&gt;
	AtomicInteger[] forks;&lt;br /&gt;
	int id,left,right,N,myTicket;&lt;br /&gt;
	Table t;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public Philosopher(AtomicInteger[] forks, int id, int n,Table table) {&lt;br /&gt;
		this.forks = forks;&lt;br /&gt;
		this.id = id;&lt;br /&gt;
		N = n;&lt;br /&gt;
		left = id;&lt;br /&gt;
		right = (id+1)%n;&lt;br /&gt;
		t = table;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			int choice = (int)(Math.random() * 2);&lt;br /&gt;
&lt;br /&gt;
			switch (choice) {&lt;br /&gt;
			case 0: {&lt;br /&gt;
				eat();&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			case 1:{&lt;br /&gt;
				think();&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			default:&lt;br /&gt;
				throw new IllegalArgumentException(&amp;quot;Unexpected value: &amp;quot; + choice);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public void think() {&lt;br /&gt;
		System.out.println(&amp;quot;Philosopher &amp;quot;+id+&amp;quot; thinking&amp;quot;);&lt;br /&gt;
		try {&lt;br /&gt;
			sleep((int)(Math.random() * 3000));&lt;br /&gt;
		} catch (InterruptedException e) {&lt;br /&gt;
			// TODO Auto-generated catch block&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public void eat() {&lt;br /&gt;
		myTicket = t.ticket.getAndIncrement();&lt;br /&gt;
		synchronized (forks) {&lt;br /&gt;
&lt;br /&gt;
			System.out.println(&amp;quot;Philosopher &amp;quot;+id+&amp;quot; wants to eat&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			while(forks[left].intValue() == 0 || forks[right].intValue() == 0 || myTicket != t.next)&lt;br /&gt;
				try {&lt;br /&gt;
					forks.wait();&lt;br /&gt;
				} catch (InterruptedException e) {&lt;br /&gt;
					// TODO Auto-generated catch block&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			System.out.println(&amp;quot;Philosopher &amp;quot;+id+&amp;quot; started eating&amp;quot;);&lt;br /&gt;
			t.next++;&lt;br /&gt;
			forks[left].set(0);&lt;br /&gt;
			forks[right].set(0);&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			sleep((int)(Math.random() * 2000));&lt;br /&gt;
		} catch (InterruptedException e) {&lt;br /&gt;
			// TODO Auto-generated catch block&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		synchronized (forks) {&lt;br /&gt;
&lt;br /&gt;
			System.out.println(&amp;quot;Philosopher &amp;quot;+id+&amp;quot; finished eating&amp;quot;);&lt;br /&gt;
			forks[left].set(1);&lt;br /&gt;
			forks[right].set(1);&lt;br /&gt;
			forks.notifyAll();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решење за Child Care ==&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ChildCare;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
		Kindergarten k = new Kindergarten(12);&lt;br /&gt;
		k.startProgram(4, 3);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;Kindergarten.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ChildCare;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.ConcurrentLinkedQueue;&lt;br /&gt;
&lt;br /&gt;
public class Kindergarten {&lt;br /&gt;
	int childrenInside = 0;&lt;br /&gt;
	int teachersInside = 0;&lt;br /&gt;
	int capacity;&lt;br /&gt;
	public ConcurrentLinkedQueue&amp;lt;Integer&amp;gt; parentQueue;&lt;br /&gt;
	public ConcurrentLinkedQueue&amp;lt;Integer&amp;gt; teacherQueue;&lt;br /&gt;
	public Kindergarten(int capacity) { &lt;br /&gt;
		parentQueue = new ConcurrentLinkedQueue&amp;lt;Integer&amp;gt;();&lt;br /&gt;
		teacherQueue = new ConcurrentLinkedQueue&amp;lt;Integer&amp;gt;();&lt;br /&gt;
		this.capacity = capacity;&lt;br /&gt;
	}&lt;br /&gt;
	public static boolean ruleFollowed(int teachers, int children, int capacity ) {&lt;br /&gt;
		if(teachers == 0 || children &amp;gt; capacity) return false;&lt;br /&gt;
		return teachers &amp;gt;= Math.ceil(children / 3.0);&lt;br /&gt;
	}&lt;br /&gt;
	public void startProgram(int teachersUsed, int parentsUsed) {&lt;br /&gt;
		Teacher[] teachers = new Teacher[teachersUsed];&lt;br /&gt;
		Parent[] parents = new Parent[parentsUsed];&lt;br /&gt;
		for(int i = 0; i &amp;lt; teachersUsed; i++) {&lt;br /&gt;
			teachers[i] = new Teacher(i, this);&lt;br /&gt;
			teachers[i].start();&lt;br /&gt;
		}&lt;br /&gt;
		for(int i = 0; i &amp;lt; parentsUsed; i++) {&lt;br /&gt;
			parents[i] = new Parent(i, this);&lt;br /&gt;
			parents[i].start();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Teacher.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ChildCare;&lt;br /&gt;
&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
import java.util.concurrent.ConcurrentLinkedQueue;&lt;br /&gt;
&lt;br /&gt;
public class Teacher extends Thread {&lt;br /&gt;
	Kindergarten k;&lt;br /&gt;
	int id;&lt;br /&gt;
	&lt;br /&gt;
	public Teacher(int id, Kindergarten k) {&lt;br /&gt;
		this.k = k;&lt;br /&gt;
		this.id = id;&lt;br /&gt;
	}&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep(new Random().nextInt(5000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			synchronized(k) {&lt;br /&gt;
				k.teachersInside++;&lt;br /&gt;
				System.out.println(&amp;quot;Teacher &amp;quot; + id + &amp;quot; came to work.&amp;quot;);&lt;br /&gt;
				k.notifyAll();&lt;br /&gt;
			}&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep(new Random().nextInt(5000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			synchronized(k) {&lt;br /&gt;
				k.teacherQueue.add(id);&lt;br /&gt;
				System.out.println(&amp;quot;Teacher &amp;quot; + id + &amp;quot; wishes to leave work.&amp;quot;);&lt;br /&gt;
				while(!(k.teacherQueue.element() == id &amp;amp;&amp;amp; Kindergarten.ruleFollowed(k.teachersInside - 1, k.childrenInside, k.capacity))) {&lt;br /&gt;
					try {&lt;br /&gt;
						k.wait();&lt;br /&gt;
					} catch (InterruptedException e) {&lt;br /&gt;
						e.printStackTrace();&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				System.out.println(&amp;quot;Teacher &amp;quot; + id + &amp;quot; has left work.&amp;quot;);&lt;br /&gt;
				k.teachersInside--;&lt;br /&gt;
				k.teacherQueue.remove();&lt;br /&gt;
				k.notifyAll();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Parent.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ChildCare;&lt;br /&gt;
&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
import java.util.concurrent.ConcurrentLinkedQueue;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class Parent extends Thread {&lt;br /&gt;
	&lt;br /&gt;
	boolean interacted = false;&lt;br /&gt;
	Kindergarten k;&lt;br /&gt;
	int id;&lt;br /&gt;
	public Parent(int id, Kindergarten k) {&lt;br /&gt;
		this.k = k;&lt;br /&gt;
		this.id = id;&lt;br /&gt;
	}&lt;br /&gt;
	public void run() {&lt;br /&gt;
		&lt;br /&gt;
		while(true) {&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep(new Random().nextInt(5000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			int childrenBrought = 1 + new Random().nextInt(4);&lt;br /&gt;
			System.out.println(&amp;quot;Parent &amp;quot; + id + &amp;quot; brought &amp;quot; + childrenBrought + &amp;quot; children.&amp;quot;);&lt;br /&gt;
			interacted = false;&lt;br /&gt;
&lt;br /&gt;
			synchronized(k) {&lt;br /&gt;
				k.parentQueue.add(id);&lt;br /&gt;
				while(!(k.parentQueue.peek() == id &amp;amp;&amp;amp; Kindergarten.ruleFollowed(k.teachersInside, k.childrenInside + childrenBrought, k.capacity))) {&lt;br /&gt;
					try {&lt;br /&gt;
						k.wait();&lt;br /&gt;
					} catch (InterruptedException e) {&lt;br /&gt;
						e.printStackTrace();&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				k.parentQueue.remove();&lt;br /&gt;
				k.childrenInside += childrenBrought;&lt;br /&gt;
				System.out.println(&amp;quot;Parent &amp;quot; + id + &amp;quot; left his &amp;quot; + childrenBrought + &amp;quot; children.&amp;quot;);&lt;br /&gt;
				k.notifyAll();&lt;br /&gt;
			}&lt;br /&gt;
			while(childrenBrought &amp;gt; 0) {&lt;br /&gt;
				try {&lt;br /&gt;
					Thread.sleep(new Random().nextInt(5000));&lt;br /&gt;
				} catch (InterruptedException e) {&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
				int childrenToPickUp = 1 + (1 + new Random().nextInt(4)) % childrenBrought;&lt;br /&gt;
				synchronized(k) {&lt;br /&gt;
					k.childrenInside -= childrenToPickUp;&lt;br /&gt;
					System.out.println(&amp;quot;Parent &amp;quot; + id + &amp;quot; took home his &amp;quot; + childrenToPickUp + &amp;quot;/&amp;quot; + childrenBrought + &amp;quot; children.&amp;quot;);&lt;br /&gt;
					k.notifyAll();&lt;br /&gt;
				}&lt;br /&gt;
				childrenBrought -= childrenToPickUp;&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;/div&gt;</summary>
		<author><name>Mf230002d</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%9B%D0%B0%D0%B1_1_2024&amp;diff=8378</id>
		<title>КДП/Лаб 1 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%9B%D0%B0%D0%B1_1_2024&amp;diff=8378"/>
		<updated>2026-06-01T19:38:20Z</updated>

		<summary type="html">&lt;p&gt;Mf230002d: /* Teacher.java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Прва лабораторијска вежба 2024. године&#039;&#039;&#039; одржана је 29. i 30. априла и носила је 10 бодова (3 бода Moodle 7 бодова задатак). Укупно је било 4 групе. &lt;br /&gt;
&lt;br /&gt;
== Улазни тест Група 1 и 2 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Уколико нит А позове a(), а нит Б позове b(), шта ће се десити са нити Б?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class A {&lt;br /&gt;
	public synchronized void a() {&lt;br /&gt;
		//neki kod ...&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public synchronized void b() {&lt;br /&gt;
		//neki kod..&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	A obj = new A();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одговор: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Зауставиће се док се не изврши a()&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
&lt;br /&gt;
Који од следећег су валидни начини да се иницијализује нит?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;Runnable r = new Runnable() {&lt;br /&gt;
	    public void run(){ /*neki kod*/ }&lt;br /&gt;
	};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Runnable r = new Runnable() {&lt;br /&gt;
		public void run(){ /*neki kod*/}&lt;br /&gt;
	};&lt;br /&gt;
Thread t = new Thread(r);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Thread t = new Thread();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;public class Nit extends Thread {&lt;br /&gt;
	public void run(){ /*neki kod*/ }&lt;br /&gt;
}&lt;br /&gt;
Nit t = new Nit();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Thread t = new Thread() {&lt;br /&gt;
	public void run(){ /*neki kod*/ }&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
&lt;br /&gt;
Прва нит извршава &amp;lt;code&amp;gt;readMethod()&amp;lt;/code&amp;gt; и закључала је &amp;lt;code&amp;gt;readLock&amp;lt;/code&amp;gt;. Друга нит је позвала &amp;lt;code&amp;gt;writeMethod()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class LockExample {&lt;br /&gt;
    private static final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();&lt;br /&gt;
&lt;br /&gt;
    public void readMethod() {&lt;br /&gt;
        rwLock.readLock().lock();&lt;br /&gt;
        try {&lt;br /&gt;
            // Neki kod...&lt;br /&gt;
        } finally {&lt;br /&gt;
            rwLock.readLock().unlock();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void writeMethod() {&lt;br /&gt;
        if (!rwLock.isWriteLocked()) {&lt;br /&gt;
            rwLock.writeLock().lock();&lt;br /&gt;
            try {&lt;br /&gt;
                // Neki kod..&lt;br /&gt;
            } finally {&lt;br /&gt;
                rwLock.writeLock().unlock();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чему служи параметар у конструктору &amp;lt;code&amp;gt;ReentrantReadWriteLock&amp;lt;/code&amp;gt;?&lt;br /&gt;
Одговор: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;FIFO Fairness&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шта се дешава са другом нити?&lt;br /&gt;
Одговор: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Блокира се на &amp;lt;code&amp;gt;writeLock&amp;lt;/code&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Улазни тест Групe 3 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Када нит T увек трајно престаје да се извршава?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# Када нит позове wait над неким објектом.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Када се заврши њена run метода.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Када позове своју interrupt методу.&lt;br /&gt;
# Ниједан од понуђених одговора.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
&lt;br /&gt;
Који од наведених исказа су тачни?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&amp;lt;code&amp;gt;ArrayBlockingQueue&amp;lt;/code&amp;gt; je pogodan za rešavanje ProducerConsumer problema.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;add(E e) i remove()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingQueue&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;putFirst(E e) i takeLast()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingDeque&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;transfer(E e) i take()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;TransferQueue&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;putFirst(E e) i takeFirst()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingDeque&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
&lt;br /&gt;
Уколико нит threadA тренутно извршава методу обј.а(), а потом нит threadB позива методу обј.б(), који од понуђених одговора су тачни, уколико је дат следећи део кода?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class A {&lt;br /&gt;
  private ReentrantReadWriteLock rw = new ReentrantReadWriteLock(true);&lt;br /&gt;
&lt;br /&gt;
  public void a() {&lt;br /&gt;
    try {&lt;br /&gt;
      rw.readLock().lock();&lt;br /&gt;
      // kritična sekcija A...  // &amp;lt;- threadA&lt;br /&gt;
    } finally {&lt;br /&gt;
      rw.readLock().unlock();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public void b() {&lt;br /&gt;
    try {&lt;br /&gt;
      if (rw.getReadLockCount()==0) {&lt;br /&gt;
        rw.writeLock().lock();&lt;br /&gt;
      }&lt;br /&gt;
      // kritična sekcija B...&lt;br /&gt;
    } finally {&lt;br /&gt;
      rw.writeLock().unlock();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
A obj = new A();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; Десиће се грешка приликом извршавања.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Аргумент конструктора ReentrantReadWriteLock означава да могу две нити истовремено да позивају закључавање.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Нити А и Б могу истовремено да извршавају критичне секције у методама a() и b() (респективно).&amp;lt;/span&amp;gt;&lt;br /&gt;
# Нит Б ће бити блокирана док нит А не заврши позив методе a().&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Аргумент конструктора ReentrantReadWriteLock означава да ли ће се буђење нити обављати по FIFO принципу.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Нит Б неће извршити закључавање, јер услов if-a није испуњен.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Улазни тест Групe 4 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
&lt;br /&gt;
Који од следећег су валидни начини да се иницијализује нит?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;Runnable r = new Runnable() {&lt;br /&gt;
	    public void run(){ /*neki kod*/ }&lt;br /&gt;
	};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Runnable r = new Runnable() {&lt;br /&gt;
		public void run(){ /*neki kod*/}&lt;br /&gt;
	};&lt;br /&gt;
Thread t = new Thread(r);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Thread t = new Thread();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;public class Nit extends Thread {&lt;br /&gt;
	public void run(){ /*neki kod*/ }&lt;br /&gt;
}&lt;br /&gt;
Nit t = new Nit();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Thread t = new Thread() {&lt;br /&gt;
	public void run(){ /*neki kod*/ }&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
&lt;br /&gt;
Који од наведених исказа су тачни?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&amp;lt;code&amp;gt;ArrayBlockingQueue&amp;lt;/code&amp;gt; je pogodan za rešavanje ProducerConsumer problema.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;add(E e) i remove()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingQueue&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;putFirst(E e) i takeLast()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingDeque&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;transfer(E e) i take()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;TransferQueue&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;putFirst(E e) i takeFirst()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingDeque&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
&lt;br /&gt;
Како правилно осигурати међусобно искључивање критичне секције?&lt;br /&gt;
&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Поставка Свих Група==&lt;br /&gt;
&lt;br /&gt;
У зависности од групе било је потребно решити један од следећих проблема:&lt;br /&gt;
&lt;br /&gt;
1. Решити &amp;lt;code&amp;gt;Atomic Broadcast&amp;lt;/code&amp;gt; проблем користећи &amp;lt;code&amp;gt;AtomicInteger&amp;lt;/code&amp;gt; и опционо &amp;lt;code&amp;gt;Semaphore&amp;lt;/code&amp;gt; . Бафер садржи B елемената. Потребно је да програм буде максимално конкурентан и отпоран на прекиде.&lt;br /&gt;
&lt;br /&gt;
2. Решити &amp;lt;code&amp;gt;H2O&amp;lt;/code&amp;gt; проблем користећи &amp;lt;code&amp;gt;CyclicBarrier&amp;lt;/code&amp;gt;. Потребно је да програм буде максимално конкурентан и отпоран на прекиде.&lt;br /&gt;
&lt;br /&gt;
3. Решити &amp;lt;code&amp;gt;Dining Philosophers&amp;lt;/code&amp;gt; проблем користећи &amp;lt;code&amp;gt;AtomicInteger&amp;lt;/code&amp;gt; и регионе. филозофи који су раније изразили жељу за храном треба раније да буду опслужени . Потребно је да програм буде максимално конкурентан и отпоран на прекиде.&lt;br /&gt;
&lt;br /&gt;
4. Решити &amp;lt;code&amp;gt;Child Care&amp;lt;/code&amp;gt; проблем користећи &amp;lt;code&amp;gt;ConcurrentLinkedQueue&amp;lt;/code&amp;gt; и друге произвољне синхронизационе директиве. Родитељ доводи једно или више деце у обданиште и чека све док се не појави место, како би оставио сву децу одједном и отишао. Родитељ може и да одведе једно или више деце, такође одједном. Мора се поштовати редослед доласка родитеља који остављају децу и васпитачица које одлазе са посла. Потребно је да програм буде максимално конкурентан и отпоран на прекиде.&lt;br /&gt;
&lt;br /&gt;
== Решење за Atomic Broadcast ==&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G1;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
&lt;br /&gt;
	private static final int consumersCount=3;&lt;br /&gt;
	private static final int b=5;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
		AtomicInteger[][] reads = new AtomicInteger[b][consumersCount];&lt;br /&gt;
&lt;br /&gt;
		Semaphore mutex = new Semaphore(1);&lt;br /&gt;
&lt;br /&gt;
		AtomicInteger[] buffer = new AtomicInteger[b];&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; buffer.length; i++)&lt;br /&gt;
			buffer[i] = new AtomicInteger(0);&lt;br /&gt;
&lt;br /&gt;
		Consumer[] consumers = new Consumer[consumersCount];&lt;br /&gt;
&lt;br /&gt;
		Producer p = new Producer(consumersCount, buffer, reads,b,mutex);&lt;br /&gt;
		p.start();&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; b; i++)&lt;br /&gt;
			for(int j=0;j&amp;lt;consumersCount;j++)&lt;br /&gt;
				reads[i][j] = new AtomicInteger(1);&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; consumersCount; i++) {&lt;br /&gt;
			consumers[i] = new Consumer(buffer, reads,b,mutex,i);&lt;br /&gt;
			consumers[i].start();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Producer.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G1;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Producer extends Thread {&lt;br /&gt;
&lt;br /&gt;
	private final int consumers;&lt;br /&gt;
	private AtomicInteger[] buffer;&lt;br /&gt;
	private AtomicInteger[][] reads;&lt;br /&gt;
	private Semaphore mutex;&lt;br /&gt;
	private int b;&lt;br /&gt;
&lt;br /&gt;
	public Producer(int consumers, AtomicInteger[] buffer, AtomicInteger[][] reads, int bb, Semaphore mutex) {&lt;br /&gt;
		this.consumers = consumers;&lt;br /&gt;
		this.buffer = buffer;&lt;br /&gt;
		this.reads = reads;&lt;br /&gt;
		b=bb;&lt;br /&gt;
		this.mutex = mutex;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		for (int i = 0; i &amp;lt;b; i++) {&lt;br /&gt;
			for (int j = 0; j &amp;lt; consumers; j++)&lt;br /&gt;
				while(reads[i][j].get() == 0)&lt;br /&gt;
					Thread.onSpinWait();&lt;br /&gt;
&lt;br /&gt;
			int rand = (int)(Math.random() * 10);&lt;br /&gt;
			System.out.println(&amp;quot;Producer produced element: &amp;quot; + rand );&lt;br /&gt;
			mutex.acquireUninterruptibly();&lt;br /&gt;
			buffer[i].set(rand);&lt;br /&gt;
			mutex.release();&lt;br /&gt;
&lt;br /&gt;
			mutex.acquireUninterruptibly();&lt;br /&gt;
			for (int j2 = 0; j2 &amp;lt; consumers; j2++)&lt;br /&gt;
				reads[i][j2].set(0);&lt;br /&gt;
&lt;br /&gt;
			mutex.release();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Consumer.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G1;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Consumer extends Thread {&lt;br /&gt;
&lt;br /&gt;
	private int id;&lt;br /&gt;
	private AtomicInteger[][] reads;&lt;br /&gt;
	private AtomicInteger[] buffer;&lt;br /&gt;
	private Semaphore mutex;&lt;br /&gt;
	private int b;&lt;br /&gt;
&lt;br /&gt;
	public Consumer(AtomicInteger[] buff, AtomicInteger[][] r, int bb,Semaphore mutex, int i) {&lt;br /&gt;
		buffer = buff;&lt;br /&gt;
		reads=r;&lt;br /&gt;
		id=i;&lt;br /&gt;
		this.mutex = mutex;&lt;br /&gt;
		b=bb;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		for (int i = 0; i &amp;lt; b; i++) {&lt;br /&gt;
			while(reads[i][id].get() == 1)&lt;br /&gt;
				Thread.onSpinWait();&lt;br /&gt;
			mutex.acquireUninterruptibly();&lt;br /&gt;
			int elem = buffer[i].get();&lt;br /&gt;
			System.out.println(&amp;quot;Consumer &amp;quot;+id+&amp;quot; consumed element &amp;quot;+elem +&amp;quot;from place &amp;quot;+i);&lt;br /&gt;
			reads[i][id].set(1);&lt;br /&gt;
			mutex.release();&lt;br /&gt;
&lt;br /&gt;
			try {&lt;br /&gt;
				sleep((int)(Math.random()*2000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				throw new RuntimeException(e);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решење за H2O ==&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package H20;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.CyclicBarrier;&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
		int cnt = 10;&lt;br /&gt;
		&lt;br /&gt;
		Barrier barrier = new Barrier(new CyclicBarrier(3));&lt;br /&gt;
		&lt;br /&gt;
		Hydrogen[] h = new Hydrogen[cnt*2];&lt;br /&gt;
		Oxygen[] o = new Oxygen[cnt];&lt;br /&gt;
		&lt;br /&gt;
		for(int i = 0; i &amp;lt; cnt; i++) {&lt;br /&gt;
			o[i] = new Oxygen(barrier);&lt;br /&gt;
			h[2*i] = new Hydrogen(barrier);	&lt;br /&gt;
			h[2*i + 1] = new Hydrogen(barrier);	&lt;br /&gt;
			&lt;br /&gt;
			o[i].start();&lt;br /&gt;
			h[2*i].start();&lt;br /&gt;
			h[2*i+1].start();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;Oxygen.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package H20;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.BrokenBarrierException;&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
&lt;br /&gt;
public class Oxygen extends Thread {&lt;br /&gt;
	&lt;br /&gt;
	Barrier barrier;&lt;br /&gt;
	&lt;br /&gt;
	Oxygen(Barrier b){&lt;br /&gt;
		barrier = b;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep((int)(Math.random() * 4000));&lt;br /&gt;
			} catch (InterruptedException e) {}&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			barrier.oxygen.acquireUninterruptibly();&lt;br /&gt;
&lt;br /&gt;
			barrier.oCount++;&lt;br /&gt;
			&lt;br /&gt;
			try {&lt;br /&gt;
				System.out.println(&amp;quot;Kiseonik pristigao na barijeru&amp;quot;);&lt;br /&gt;
				&lt;br /&gt;
				if(barrier.barrier.await() == 0) {&lt;br /&gt;
					System.out.println(&amp;quot;\nFORMIRANJE VODE!\n&amp;quot;);&lt;br /&gt;
					&lt;br /&gt;
					barrier.hCount = 0;&lt;br /&gt;
					barrier.oCount = 1;&lt;br /&gt;
					&lt;br /&gt;
					barrier.hydrogen.release(2);&lt;br /&gt;
					barrier.oxygen.release(1);&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
			} catch (InterruptedException | BrokenBarrierException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Hydrogen.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package H20;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.BrokenBarrierException;&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
&lt;br /&gt;
public class Hydrogen extends Thread {&lt;br /&gt;
	&lt;br /&gt;
	Barrier barrier;&lt;br /&gt;
	&lt;br /&gt;
	Hydrogen(Barrier b){&lt;br /&gt;
		barrier = b;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep((int)(Math.random() * 4000));&lt;br /&gt;
			} catch (InterruptedException e) {}&lt;br /&gt;
			&lt;br /&gt;
			barrier.hydrogen.acquireUninterruptibly();&lt;br /&gt;
&lt;br /&gt;
			barrier.hCount++;&lt;br /&gt;
			&lt;br /&gt;
			try {&lt;br /&gt;
				System.out.println(&amp;quot;Vodonik pristigao na barijeru&amp;quot;);&lt;br /&gt;
				&lt;br /&gt;
				if(barrier.barrier.await() == 0) {&lt;br /&gt;
					System.out.println(&amp;quot;\nFORMIRANJE VODE!\n&amp;quot;);&lt;br /&gt;
					barrier.hCount = 0;&lt;br /&gt;
					barrier.oCount = 1;&lt;br /&gt;
					&lt;br /&gt;
					barrier.hydrogen.release(2);&lt;br /&gt;
					barrier.oxygen.release(1);&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
			} catch (InterruptedException | BrokenBarrierException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Barrier.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package H20;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.CyclicBarrier;&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
&lt;br /&gt;
public class Barrier {&lt;br /&gt;
	CyclicBarrier barrier;&lt;br /&gt;
	Semaphore hydrogen, oxygen;&lt;br /&gt;
	int hCount, oCount;&lt;br /&gt;
	&lt;br /&gt;
	Barrier(CyclicBarrier cb){&lt;br /&gt;
		barrier = cb;&lt;br /&gt;
		hCount = 0;&lt;br /&gt;
		oCount = 0;&lt;br /&gt;
		hydrogen = new Semaphore(2);&lt;br /&gt;
		oxygen = new Semaphore(1);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решење за Dining Philosophers ==&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G3;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
&lt;br /&gt;
	public static final int N = 5;&lt;br /&gt;
&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
		Philosopher[] philosophers = new Philosopher[N];&lt;br /&gt;
		AtomicInteger[] forks = new AtomicInteger[N];&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; forks.length; i++)&lt;br /&gt;
			forks[i] = new AtomicInteger(1);&lt;br /&gt;
&lt;br /&gt;
		Table table = new Table();&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
			philosophers[i] = new Philosopher(forks, i, N, table);&lt;br /&gt;
			philosophers[i].start();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;Table.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G3;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Table {&lt;br /&gt;
&lt;br /&gt;
	AtomicInteger ticket;&lt;br /&gt;
	int next;&lt;br /&gt;
&lt;br /&gt;
	public Table() {&lt;br /&gt;
		ticket = new AtomicInteger(0);&lt;br /&gt;
		next = 0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Philosopher.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G3;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Philosopher extends Thread {&lt;br /&gt;
&lt;br /&gt;
	AtomicInteger[] forks;&lt;br /&gt;
	int id,left,right,N,myTicket;&lt;br /&gt;
	Table t;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public Philosopher(AtomicInteger[] forks, int id, int n,Table table) {&lt;br /&gt;
		this.forks = forks;&lt;br /&gt;
		this.id = id;&lt;br /&gt;
		N = n;&lt;br /&gt;
		left = id;&lt;br /&gt;
		right = (id+1)%n;&lt;br /&gt;
		t = table;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			int choice = (int)(Math.random() * 2);&lt;br /&gt;
&lt;br /&gt;
			switch (choice) {&lt;br /&gt;
			case 0: {&lt;br /&gt;
				eat();&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			case 1:{&lt;br /&gt;
				think();&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			default:&lt;br /&gt;
				throw new IllegalArgumentException(&amp;quot;Unexpected value: &amp;quot; + choice);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public void think() {&lt;br /&gt;
		System.out.println(&amp;quot;Philosopher &amp;quot;+id+&amp;quot; thinking&amp;quot;);&lt;br /&gt;
		try {&lt;br /&gt;
			sleep((int)(Math.random() * 3000));&lt;br /&gt;
		} catch (InterruptedException e) {&lt;br /&gt;
			// TODO Auto-generated catch block&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public void eat() {&lt;br /&gt;
		myTicket = t.ticket.getAndIncrement();&lt;br /&gt;
		synchronized (forks) {&lt;br /&gt;
&lt;br /&gt;
			System.out.println(&amp;quot;Philosopher &amp;quot;+id+&amp;quot; wants to eat&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			while(forks[left].intValue() == 0 || forks[right].intValue() == 0 || myTicket != t.next)&lt;br /&gt;
				try {&lt;br /&gt;
					forks.wait();&lt;br /&gt;
				} catch (InterruptedException e) {&lt;br /&gt;
					// TODO Auto-generated catch block&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			System.out.println(&amp;quot;Philosopher &amp;quot;+id+&amp;quot; started eating&amp;quot;);&lt;br /&gt;
			t.next++;&lt;br /&gt;
			forks[left].set(0);&lt;br /&gt;
			forks[right].set(0);&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			sleep((int)(Math.random() * 2000));&lt;br /&gt;
		} catch (InterruptedException e) {&lt;br /&gt;
			// TODO Auto-generated catch block&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		synchronized (forks) {&lt;br /&gt;
&lt;br /&gt;
			System.out.println(&amp;quot;Philosopher &amp;quot;+id+&amp;quot; finished eating&amp;quot;);&lt;br /&gt;
			forks[left].set(1);&lt;br /&gt;
			forks[right].set(1);&lt;br /&gt;
			forks.notifyAll();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решење за Child Care ==&lt;br /&gt;
== Решење за Child Care ==&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ChildCare;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
		Kindergarten k = new Kindergarten(12);&lt;br /&gt;
		k.startProgram(4, 3);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;Kindergarten.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ChildCare;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.ConcurrentLinkedQueue;&lt;br /&gt;
&lt;br /&gt;
public class Kindergarten {&lt;br /&gt;
	int childrenInside = 0;&lt;br /&gt;
	int teachersInside = 0;&lt;br /&gt;
	int capacity;&lt;br /&gt;
	public ConcurrentLinkedQueue&amp;lt;Integer&amp;gt; parentQueue;&lt;br /&gt;
	public ConcurrentLinkedQueue&amp;lt;Integer&amp;gt; teacherQueue;&lt;br /&gt;
	public Kindergarten(int capacity) { &lt;br /&gt;
		parentQueue = new ConcurrentLinkedQueue&amp;lt;Integer&amp;gt;();&lt;br /&gt;
		teacherQueue = new ConcurrentLinkedQueue&amp;lt;Integer&amp;gt;();&lt;br /&gt;
		this.capacity = capacity;&lt;br /&gt;
	}&lt;br /&gt;
	public static boolean ruleFollowed(int teachers, int children, int capacity ) {&lt;br /&gt;
		if(teachers == 0 || children &amp;gt; capacity) return false;&lt;br /&gt;
		return teachers &amp;gt;= Math.ceil(children / 3.0);&lt;br /&gt;
	}&lt;br /&gt;
	public void startProgram(int teachersUsed, int parentsUsed) {&lt;br /&gt;
		Teacher[] teachers = new Teacher[teachersUsed];&lt;br /&gt;
		Parent[] parents = new Parent[parentsUsed];&lt;br /&gt;
		for(int i = 0; i &amp;lt; teachersUsed; i++) {&lt;br /&gt;
			teachers[i] = new Teacher(i, this);&lt;br /&gt;
			teachers[i].start();&lt;br /&gt;
		}&lt;br /&gt;
		for(int i = 0; i &amp;lt; parentsUsed; i++) {&lt;br /&gt;
			parents[i] = new Parent(i, this);&lt;br /&gt;
			parents[i].start();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Teacher.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ChildCare;&lt;br /&gt;
&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
import java.util.concurrent.ConcurrentLinkedQueue;&lt;br /&gt;
&lt;br /&gt;
public class Teacher extends Thread {&lt;br /&gt;
	Kindergarten k;&lt;br /&gt;
	int id;&lt;br /&gt;
	&lt;br /&gt;
	public Teacher(int id, Kindergarten k) {&lt;br /&gt;
		this.k = k;&lt;br /&gt;
		this.id = id;&lt;br /&gt;
	}&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep(new Random().nextInt(5000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			synchronized(k) {&lt;br /&gt;
				k.teachersInside++;&lt;br /&gt;
				System.out.println(&amp;quot;Teacher &amp;quot; + id + &amp;quot; came to work.&amp;quot;);&lt;br /&gt;
				k.notifyAll();&lt;br /&gt;
			}&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep(new Random().nextInt(5000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			synchronized(k) {&lt;br /&gt;
				k.teacherQueue.add(id);&lt;br /&gt;
				System.out.println(&amp;quot;Teacher &amp;quot; + id + &amp;quot; wishes to leave work.&amp;quot;);&lt;br /&gt;
				while(!(k.teacherQueue.element() == id &amp;amp;&amp;amp; Kindergarten.ruleFollowed(k.teachersInside - 1, k.childrenInside, k.capacity))) {&lt;br /&gt;
					try {&lt;br /&gt;
						k.wait();&lt;br /&gt;
					} catch (InterruptedException e) {&lt;br /&gt;
						e.printStackTrace();&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				System.out.println(&amp;quot;Teacher &amp;quot; + id + &amp;quot; has left work.&amp;quot;);&lt;br /&gt;
				k.teachersInside--;&lt;br /&gt;
				k.teacherQueue.remove();&lt;br /&gt;
				k.notifyAll();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Parent.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ChildCare;&lt;br /&gt;
&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
import java.util.concurrent.ConcurrentLinkedQueue;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class Parent extends Thread {&lt;br /&gt;
	&lt;br /&gt;
	boolean interacted = false;&lt;br /&gt;
	Kindergarten k;&lt;br /&gt;
	int id;&lt;br /&gt;
	public Parent(int id, Kindergarten k) {&lt;br /&gt;
		this.k = k;&lt;br /&gt;
		this.id = id;&lt;br /&gt;
	}&lt;br /&gt;
	public void run() {&lt;br /&gt;
		&lt;br /&gt;
		while(true) {&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep(new Random().nextInt(5000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			int childrenBrought = 1 + new Random().nextInt(4);&lt;br /&gt;
			System.out.println(&amp;quot;Parent &amp;quot; + id + &amp;quot; brought &amp;quot; + childrenBrought + &amp;quot; children.&amp;quot;);&lt;br /&gt;
			interacted = false;&lt;br /&gt;
&lt;br /&gt;
			synchronized(k) {&lt;br /&gt;
				k.parentQueue.add(id);&lt;br /&gt;
				while(!(k.parentQueue.peek() == id &amp;amp;&amp;amp; Kindergarten.ruleFollowed(k.teachersInside, k.childrenInside + childrenBrought, k.capacity))) {&lt;br /&gt;
					try {&lt;br /&gt;
						k.wait();&lt;br /&gt;
					} catch (InterruptedException e) {&lt;br /&gt;
						e.printStackTrace();&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				k.parentQueue.remove();&lt;br /&gt;
				k.childrenInside += childrenBrought;&lt;br /&gt;
				System.out.println(&amp;quot;Parent &amp;quot; + id + &amp;quot; left his &amp;quot; + childrenBrought + &amp;quot; children.&amp;quot;);&lt;br /&gt;
				k.notifyAll();&lt;br /&gt;
			}&lt;br /&gt;
			while(childrenBrought &amp;gt; 0) {&lt;br /&gt;
				try {&lt;br /&gt;
					Thread.sleep(new Random().nextInt(5000));&lt;br /&gt;
				} catch (InterruptedException e) {&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
				int childrenToPickUp = 1 + (1 + new Random().nextInt(4)) % childrenBrought;&lt;br /&gt;
				synchronized(k) {&lt;br /&gt;
					k.childrenInside -= childrenToPickUp;&lt;br /&gt;
					System.out.println(&amp;quot;Parent &amp;quot; + id + &amp;quot; took home his &amp;quot; + childrenToPickUp + &amp;quot;/&amp;quot; + childrenBrought + &amp;quot; children.&amp;quot;);&lt;br /&gt;
					k.notifyAll();&lt;br /&gt;
				}&lt;br /&gt;
				childrenBrought -= childrenToPickUp;&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;/div&gt;</summary>
		<author><name>Mf230002d</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%9B%D0%B0%D0%B1_1_2024&amp;diff=8377</id>
		<title>КДП/Лаб 1 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%9B%D0%B0%D0%B1_1_2024&amp;diff=8377"/>
		<updated>2026-06-01T19:37:48Z</updated>

		<summary type="html">&lt;p&gt;Mf230002d: /* Решење за Dining Philosophers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Прва лабораторијска вежба 2024. године&#039;&#039;&#039; одржана је 29. i 30. априла и носила је 10 бодова (3 бода Moodle 7 бодова задатак). Укупно је било 4 групе. &lt;br /&gt;
&lt;br /&gt;
== Улазни тест Група 1 и 2 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Уколико нит А позове a(), а нит Б позове b(), шта ће се десити са нити Б?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class A {&lt;br /&gt;
	public synchronized void a() {&lt;br /&gt;
		//neki kod ...&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public synchronized void b() {&lt;br /&gt;
		//neki kod..&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	A obj = new A();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одговор: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Зауставиће се док се не изврши a()&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
&lt;br /&gt;
Који од следећег су валидни начини да се иницијализује нит?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;Runnable r = new Runnable() {&lt;br /&gt;
	    public void run(){ /*neki kod*/ }&lt;br /&gt;
	};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Runnable r = new Runnable() {&lt;br /&gt;
		public void run(){ /*neki kod*/}&lt;br /&gt;
	};&lt;br /&gt;
Thread t = new Thread(r);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Thread t = new Thread();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;public class Nit extends Thread {&lt;br /&gt;
	public void run(){ /*neki kod*/ }&lt;br /&gt;
}&lt;br /&gt;
Nit t = new Nit();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Thread t = new Thread() {&lt;br /&gt;
	public void run(){ /*neki kod*/ }&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
&lt;br /&gt;
Прва нит извршава &amp;lt;code&amp;gt;readMethod()&amp;lt;/code&amp;gt; и закључала је &amp;lt;code&amp;gt;readLock&amp;lt;/code&amp;gt;. Друга нит је позвала &amp;lt;code&amp;gt;writeMethod()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class LockExample {&lt;br /&gt;
    private static final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();&lt;br /&gt;
&lt;br /&gt;
    public void readMethod() {&lt;br /&gt;
        rwLock.readLock().lock();&lt;br /&gt;
        try {&lt;br /&gt;
            // Neki kod...&lt;br /&gt;
        } finally {&lt;br /&gt;
            rwLock.readLock().unlock();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void writeMethod() {&lt;br /&gt;
        if (!rwLock.isWriteLocked()) {&lt;br /&gt;
            rwLock.writeLock().lock();&lt;br /&gt;
            try {&lt;br /&gt;
                // Neki kod..&lt;br /&gt;
            } finally {&lt;br /&gt;
                rwLock.writeLock().unlock();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чему служи параметар у конструктору &amp;lt;code&amp;gt;ReentrantReadWriteLock&amp;lt;/code&amp;gt;?&lt;br /&gt;
Одговор: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;FIFO Fairness&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шта се дешава са другом нити?&lt;br /&gt;
Одговор: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Блокира се на &amp;lt;code&amp;gt;writeLock&amp;lt;/code&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Улазни тест Групe 3 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Када нит T увек трајно престаје да се извршава?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# Када нит позове wait над неким објектом.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Када се заврши њена run метода.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Када позове своју interrupt методу.&lt;br /&gt;
# Ниједан од понуђених одговора.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
&lt;br /&gt;
Који од наведених исказа су тачни?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&amp;lt;code&amp;gt;ArrayBlockingQueue&amp;lt;/code&amp;gt; je pogodan za rešavanje ProducerConsumer problema.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;add(E e) i remove()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingQueue&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;putFirst(E e) i takeLast()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingDeque&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;transfer(E e) i take()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;TransferQueue&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;putFirst(E e) i takeFirst()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingDeque&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
&lt;br /&gt;
Уколико нит threadA тренутно извршава методу обј.а(), а потом нит threadB позива методу обј.б(), који од понуђених одговора су тачни, уколико је дат следећи део кода?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class A {&lt;br /&gt;
  private ReentrantReadWriteLock rw = new ReentrantReadWriteLock(true);&lt;br /&gt;
&lt;br /&gt;
  public void a() {&lt;br /&gt;
    try {&lt;br /&gt;
      rw.readLock().lock();&lt;br /&gt;
      // kritična sekcija A...  // &amp;lt;- threadA&lt;br /&gt;
    } finally {&lt;br /&gt;
      rw.readLock().unlock();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public void b() {&lt;br /&gt;
    try {&lt;br /&gt;
      if (rw.getReadLockCount()==0) {&lt;br /&gt;
        rw.writeLock().lock();&lt;br /&gt;
      }&lt;br /&gt;
      // kritična sekcija B...&lt;br /&gt;
    } finally {&lt;br /&gt;
      rw.writeLock().unlock();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
A obj = new A();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; Десиће се грешка приликом извршавања.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Аргумент конструктора ReentrantReadWriteLock означава да могу две нити истовремено да позивају закључавање.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Нити А и Б могу истовремено да извршавају критичне секције у методама a() и b() (респективно).&amp;lt;/span&amp;gt;&lt;br /&gt;
# Нит Б ће бити блокирана док нит А не заврши позив методе a().&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Аргумент конструктора ReentrantReadWriteLock означава да ли ће се буђење нити обављати по FIFO принципу.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Нит Б неће извршити закључавање, јер услов if-a није испуњен.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Улазни тест Групe 4 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
&lt;br /&gt;
Који од следећег су валидни начини да се иницијализује нит?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;Runnable r = new Runnable() {&lt;br /&gt;
	    public void run(){ /*neki kod*/ }&lt;br /&gt;
	};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Runnable r = new Runnable() {&lt;br /&gt;
		public void run(){ /*neki kod*/}&lt;br /&gt;
	};&lt;br /&gt;
Thread t = new Thread(r);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Thread t = new Thread();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;public class Nit extends Thread {&lt;br /&gt;
	public void run(){ /*neki kod*/ }&lt;br /&gt;
}&lt;br /&gt;
Nit t = new Nit();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Thread t = new Thread() {&lt;br /&gt;
	public void run(){ /*neki kod*/ }&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
&lt;br /&gt;
Који од наведених исказа су тачни?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&amp;lt;code&amp;gt;ArrayBlockingQueue&amp;lt;/code&amp;gt; je pogodan za rešavanje ProducerConsumer problema.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;add(E e) i remove()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingQueue&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;putFirst(E e) i takeLast()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingDeque&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;transfer(E e) i take()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;TransferQueue&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;putFirst(E e) i takeFirst()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingDeque&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
&lt;br /&gt;
Како правилно осигурати међусобно искључивање критичне секције?&lt;br /&gt;
&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Поставка Свих Група==&lt;br /&gt;
&lt;br /&gt;
У зависности од групе било је потребно решити један од следећих проблема:&lt;br /&gt;
&lt;br /&gt;
1. Решити &amp;lt;code&amp;gt;Atomic Broadcast&amp;lt;/code&amp;gt; проблем користећи &amp;lt;code&amp;gt;AtomicInteger&amp;lt;/code&amp;gt; и опционо &amp;lt;code&amp;gt;Semaphore&amp;lt;/code&amp;gt; . Бафер садржи B елемената. Потребно је да програм буде максимално конкурентан и отпоран на прекиде.&lt;br /&gt;
&lt;br /&gt;
2. Решити &amp;lt;code&amp;gt;H2O&amp;lt;/code&amp;gt; проблем користећи &amp;lt;code&amp;gt;CyclicBarrier&amp;lt;/code&amp;gt;. Потребно је да програм буде максимално конкурентан и отпоран на прекиде.&lt;br /&gt;
&lt;br /&gt;
3. Решити &amp;lt;code&amp;gt;Dining Philosophers&amp;lt;/code&amp;gt; проблем користећи &amp;lt;code&amp;gt;AtomicInteger&amp;lt;/code&amp;gt; и регионе. филозофи који су раније изразили жељу за храном треба раније да буду опслужени . Потребно је да програм буде максимално конкурентан и отпоран на прекиде.&lt;br /&gt;
&lt;br /&gt;
4. Решити &amp;lt;code&amp;gt;Child Care&amp;lt;/code&amp;gt; проблем користећи &amp;lt;code&amp;gt;ConcurrentLinkedQueue&amp;lt;/code&amp;gt; и друге произвољне синхронизационе директиве. Родитељ доводи једно или више деце у обданиште и чека све док се не појави место, како би оставио сву децу одједном и отишао. Родитељ може и да одведе једно или више деце, такође одједном. Мора се поштовати редослед доласка родитеља који остављају децу и васпитачица које одлазе са посла. Потребно је да програм буде максимално конкурентан и отпоран на прекиде.&lt;br /&gt;
&lt;br /&gt;
== Решење за Atomic Broadcast ==&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G1;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
&lt;br /&gt;
	private static final int consumersCount=3;&lt;br /&gt;
	private static final int b=5;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
		AtomicInteger[][] reads = new AtomicInteger[b][consumersCount];&lt;br /&gt;
&lt;br /&gt;
		Semaphore mutex = new Semaphore(1);&lt;br /&gt;
&lt;br /&gt;
		AtomicInteger[] buffer = new AtomicInteger[b];&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; buffer.length; i++)&lt;br /&gt;
			buffer[i] = new AtomicInteger(0);&lt;br /&gt;
&lt;br /&gt;
		Consumer[] consumers = new Consumer[consumersCount];&lt;br /&gt;
&lt;br /&gt;
		Producer p = new Producer(consumersCount, buffer, reads,b,mutex);&lt;br /&gt;
		p.start();&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; b; i++)&lt;br /&gt;
			for(int j=0;j&amp;lt;consumersCount;j++)&lt;br /&gt;
				reads[i][j] = new AtomicInteger(1);&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; consumersCount; i++) {&lt;br /&gt;
			consumers[i] = new Consumer(buffer, reads,b,mutex,i);&lt;br /&gt;
			consumers[i].start();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Producer.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G1;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Producer extends Thread {&lt;br /&gt;
&lt;br /&gt;
	private final int consumers;&lt;br /&gt;
	private AtomicInteger[] buffer;&lt;br /&gt;
	private AtomicInteger[][] reads;&lt;br /&gt;
	private Semaphore mutex;&lt;br /&gt;
	private int b;&lt;br /&gt;
&lt;br /&gt;
	public Producer(int consumers, AtomicInteger[] buffer, AtomicInteger[][] reads, int bb, Semaphore mutex) {&lt;br /&gt;
		this.consumers = consumers;&lt;br /&gt;
		this.buffer = buffer;&lt;br /&gt;
		this.reads = reads;&lt;br /&gt;
		b=bb;&lt;br /&gt;
		this.mutex = mutex;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		for (int i = 0; i &amp;lt;b; i++) {&lt;br /&gt;
			for (int j = 0; j &amp;lt; consumers; j++)&lt;br /&gt;
				while(reads[i][j].get() == 0)&lt;br /&gt;
					Thread.onSpinWait();&lt;br /&gt;
&lt;br /&gt;
			int rand = (int)(Math.random() * 10);&lt;br /&gt;
			System.out.println(&amp;quot;Producer produced element: &amp;quot; + rand );&lt;br /&gt;
			mutex.acquireUninterruptibly();&lt;br /&gt;
			buffer[i].set(rand);&lt;br /&gt;
			mutex.release();&lt;br /&gt;
&lt;br /&gt;
			mutex.acquireUninterruptibly();&lt;br /&gt;
			for (int j2 = 0; j2 &amp;lt; consumers; j2++)&lt;br /&gt;
				reads[i][j2].set(0);&lt;br /&gt;
&lt;br /&gt;
			mutex.release();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Consumer.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G1;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Consumer extends Thread {&lt;br /&gt;
&lt;br /&gt;
	private int id;&lt;br /&gt;
	private AtomicInteger[][] reads;&lt;br /&gt;
	private AtomicInteger[] buffer;&lt;br /&gt;
	private Semaphore mutex;&lt;br /&gt;
	private int b;&lt;br /&gt;
&lt;br /&gt;
	public Consumer(AtomicInteger[] buff, AtomicInteger[][] r, int bb,Semaphore mutex, int i) {&lt;br /&gt;
		buffer = buff;&lt;br /&gt;
		reads=r;&lt;br /&gt;
		id=i;&lt;br /&gt;
		this.mutex = mutex;&lt;br /&gt;
		b=bb;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		for (int i = 0; i &amp;lt; b; i++) {&lt;br /&gt;
			while(reads[i][id].get() == 1)&lt;br /&gt;
				Thread.onSpinWait();&lt;br /&gt;
			mutex.acquireUninterruptibly();&lt;br /&gt;
			int elem = buffer[i].get();&lt;br /&gt;
			System.out.println(&amp;quot;Consumer &amp;quot;+id+&amp;quot; consumed element &amp;quot;+elem +&amp;quot;from place &amp;quot;+i);&lt;br /&gt;
			reads[i][id].set(1);&lt;br /&gt;
			mutex.release();&lt;br /&gt;
&lt;br /&gt;
			try {&lt;br /&gt;
				sleep((int)(Math.random()*2000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				throw new RuntimeException(e);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решење за H2O ==&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package H20;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.CyclicBarrier;&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
		int cnt = 10;&lt;br /&gt;
		&lt;br /&gt;
		Barrier barrier = new Barrier(new CyclicBarrier(3));&lt;br /&gt;
		&lt;br /&gt;
		Hydrogen[] h = new Hydrogen[cnt*2];&lt;br /&gt;
		Oxygen[] o = new Oxygen[cnt];&lt;br /&gt;
		&lt;br /&gt;
		for(int i = 0; i &amp;lt; cnt; i++) {&lt;br /&gt;
			o[i] = new Oxygen(barrier);&lt;br /&gt;
			h[2*i] = new Hydrogen(barrier);	&lt;br /&gt;
			h[2*i + 1] = new Hydrogen(barrier);	&lt;br /&gt;
			&lt;br /&gt;
			o[i].start();&lt;br /&gt;
			h[2*i].start();&lt;br /&gt;
			h[2*i+1].start();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;Oxygen.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package H20;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.BrokenBarrierException;&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
&lt;br /&gt;
public class Oxygen extends Thread {&lt;br /&gt;
	&lt;br /&gt;
	Barrier barrier;&lt;br /&gt;
	&lt;br /&gt;
	Oxygen(Barrier b){&lt;br /&gt;
		barrier = b;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep((int)(Math.random() * 4000));&lt;br /&gt;
			} catch (InterruptedException e) {}&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			barrier.oxygen.acquireUninterruptibly();&lt;br /&gt;
&lt;br /&gt;
			barrier.oCount++;&lt;br /&gt;
			&lt;br /&gt;
			try {&lt;br /&gt;
				System.out.println(&amp;quot;Kiseonik pristigao na barijeru&amp;quot;);&lt;br /&gt;
				&lt;br /&gt;
				if(barrier.barrier.await() == 0) {&lt;br /&gt;
					System.out.println(&amp;quot;\nFORMIRANJE VODE!\n&amp;quot;);&lt;br /&gt;
					&lt;br /&gt;
					barrier.hCount = 0;&lt;br /&gt;
					barrier.oCount = 1;&lt;br /&gt;
					&lt;br /&gt;
					barrier.hydrogen.release(2);&lt;br /&gt;
					barrier.oxygen.release(1);&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
			} catch (InterruptedException | BrokenBarrierException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Hydrogen.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package H20;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.BrokenBarrierException;&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
&lt;br /&gt;
public class Hydrogen extends Thread {&lt;br /&gt;
	&lt;br /&gt;
	Barrier barrier;&lt;br /&gt;
	&lt;br /&gt;
	Hydrogen(Barrier b){&lt;br /&gt;
		barrier = b;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep((int)(Math.random() * 4000));&lt;br /&gt;
			} catch (InterruptedException e) {}&lt;br /&gt;
			&lt;br /&gt;
			barrier.hydrogen.acquireUninterruptibly();&lt;br /&gt;
&lt;br /&gt;
			barrier.hCount++;&lt;br /&gt;
			&lt;br /&gt;
			try {&lt;br /&gt;
				System.out.println(&amp;quot;Vodonik pristigao na barijeru&amp;quot;);&lt;br /&gt;
				&lt;br /&gt;
				if(barrier.barrier.await() == 0) {&lt;br /&gt;
					System.out.println(&amp;quot;\nFORMIRANJE VODE!\n&amp;quot;);&lt;br /&gt;
					barrier.hCount = 0;&lt;br /&gt;
					barrier.oCount = 1;&lt;br /&gt;
					&lt;br /&gt;
					barrier.hydrogen.release(2);&lt;br /&gt;
					barrier.oxygen.release(1);&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
			} catch (InterruptedException | BrokenBarrierException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Barrier.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package H20;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.CyclicBarrier;&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
&lt;br /&gt;
public class Barrier {&lt;br /&gt;
	CyclicBarrier barrier;&lt;br /&gt;
	Semaphore hydrogen, oxygen;&lt;br /&gt;
	int hCount, oCount;&lt;br /&gt;
	&lt;br /&gt;
	Barrier(CyclicBarrier cb){&lt;br /&gt;
		barrier = cb;&lt;br /&gt;
		hCount = 0;&lt;br /&gt;
		oCount = 0;&lt;br /&gt;
		hydrogen = new Semaphore(2);&lt;br /&gt;
		oxygen = new Semaphore(1);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решење за Dining Philosophers ==&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G3;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
&lt;br /&gt;
	public static final int N = 5;&lt;br /&gt;
&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
		Philosopher[] philosophers = new Philosopher[N];&lt;br /&gt;
		AtomicInteger[] forks = new AtomicInteger[N];&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; forks.length; i++)&lt;br /&gt;
			forks[i] = new AtomicInteger(1);&lt;br /&gt;
&lt;br /&gt;
		Table table = new Table();&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
			philosophers[i] = new Philosopher(forks, i, N, table);&lt;br /&gt;
			philosophers[i].start();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;Table.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G3;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Table {&lt;br /&gt;
&lt;br /&gt;
	AtomicInteger ticket;&lt;br /&gt;
	int next;&lt;br /&gt;
&lt;br /&gt;
	public Table() {&lt;br /&gt;
		ticket = new AtomicInteger(0);&lt;br /&gt;
		next = 0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Philosopher.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G3;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Philosopher extends Thread {&lt;br /&gt;
&lt;br /&gt;
	AtomicInteger[] forks;&lt;br /&gt;
	int id,left,right,N,myTicket;&lt;br /&gt;
	Table t;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public Philosopher(AtomicInteger[] forks, int id, int n,Table table) {&lt;br /&gt;
		this.forks = forks;&lt;br /&gt;
		this.id = id;&lt;br /&gt;
		N = n;&lt;br /&gt;
		left = id;&lt;br /&gt;
		right = (id+1)%n;&lt;br /&gt;
		t = table;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			int choice = (int)(Math.random() * 2);&lt;br /&gt;
&lt;br /&gt;
			switch (choice) {&lt;br /&gt;
			case 0: {&lt;br /&gt;
				eat();&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			case 1:{&lt;br /&gt;
				think();&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			default:&lt;br /&gt;
				throw new IllegalArgumentException(&amp;quot;Unexpected value: &amp;quot; + choice);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public void think() {&lt;br /&gt;
		System.out.println(&amp;quot;Philosopher &amp;quot;+id+&amp;quot; thinking&amp;quot;);&lt;br /&gt;
		try {&lt;br /&gt;
			sleep((int)(Math.random() * 3000));&lt;br /&gt;
		} catch (InterruptedException e) {&lt;br /&gt;
			// TODO Auto-generated catch block&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public void eat() {&lt;br /&gt;
		myTicket = t.ticket.getAndIncrement();&lt;br /&gt;
		synchronized (forks) {&lt;br /&gt;
&lt;br /&gt;
			System.out.println(&amp;quot;Philosopher &amp;quot;+id+&amp;quot; wants to eat&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			while(forks[left].intValue() == 0 || forks[right].intValue() == 0 || myTicket != t.next)&lt;br /&gt;
				try {&lt;br /&gt;
					forks.wait();&lt;br /&gt;
				} catch (InterruptedException e) {&lt;br /&gt;
					// TODO Auto-generated catch block&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			System.out.println(&amp;quot;Philosopher &amp;quot;+id+&amp;quot; started eating&amp;quot;);&lt;br /&gt;
			t.next++;&lt;br /&gt;
			forks[left].set(0);&lt;br /&gt;
			forks[right].set(0);&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			sleep((int)(Math.random() * 2000));&lt;br /&gt;
		} catch (InterruptedException e) {&lt;br /&gt;
			// TODO Auto-generated catch block&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		synchronized (forks) {&lt;br /&gt;
&lt;br /&gt;
			System.out.println(&amp;quot;Philosopher &amp;quot;+id+&amp;quot; finished eating&amp;quot;);&lt;br /&gt;
			forks[left].set(1);&lt;br /&gt;
			forks[right].set(1);&lt;br /&gt;
			forks.notifyAll();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решење за Child Care ==&lt;br /&gt;
== Решење за Child Care ==&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ChildCare;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
		Kindergarten k = new Kindergarten(12);&lt;br /&gt;
		k.startProgram(4, 3);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;Kindergarten.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ChildCare;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.ConcurrentLinkedQueue;&lt;br /&gt;
&lt;br /&gt;
public class Kindergarten {&lt;br /&gt;
	int childrenInside = 0;&lt;br /&gt;
	int teachersInside = 0;&lt;br /&gt;
	int capacity;&lt;br /&gt;
	public ConcurrentLinkedQueue&amp;lt;Integer&amp;gt; parentQueue;&lt;br /&gt;
	public ConcurrentLinkedQueue&amp;lt;Integer&amp;gt; teacherQueue;&lt;br /&gt;
	public Kindergarten(int capacity) { &lt;br /&gt;
		parentQueue = new ConcurrentLinkedQueue&amp;lt;Integer&amp;gt;();&lt;br /&gt;
		teacherQueue = new ConcurrentLinkedQueue&amp;lt;Integer&amp;gt;();&lt;br /&gt;
		this.capacity = capacity;&lt;br /&gt;
	}&lt;br /&gt;
	public static boolean ruleFollowed(int teachers, int children, int capacity ) {&lt;br /&gt;
		if(teachers == 0 || children &amp;gt; capacity) return false;&lt;br /&gt;
		return teachers &amp;gt;= Math.ceil(children / 3.0);&lt;br /&gt;
	}&lt;br /&gt;
	public void startProgram(int teachersUsed, int parentsUsed) {&lt;br /&gt;
		Teacher[] teachers = new Teacher[teachersUsed];&lt;br /&gt;
		Parent[] parents = new Parent[parentsUsed];&lt;br /&gt;
		for(int i = 0; i &amp;lt; teachersUsed; i++) {&lt;br /&gt;
			teachers[i] = new Teacher(i, this);&lt;br /&gt;
			teachers[i].start();&lt;br /&gt;
		}&lt;br /&gt;
		for(int i = 0; i &amp;lt; parentsUsed; i++) {&lt;br /&gt;
			parents[i] = new Parent(i, this);&lt;br /&gt;
			parents[i].start();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Teacher.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ChildCare;&lt;br /&gt;
&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
import java.util.concurrent.ConcurrentLinkedQueue;&lt;br /&gt;
&lt;br /&gt;
public class Teacher extends Thread {&lt;br /&gt;
	Kindergarten k;&lt;br /&gt;
	int id;&lt;br /&gt;
	&lt;br /&gt;
	public Teacher(int id, Kindergarten k) {&lt;br /&gt;
		this.k = k;&lt;br /&gt;
		this.id = id;&lt;br /&gt;
	}&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep(new Random().nextInt(5000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			synchronized(k) {&lt;br /&gt;
				k.teachersInside++;&lt;br /&gt;
				System.out.println(&amp;quot;Teacher &amp;quot; + id + &amp;quot; came to work.&amp;quot;);&lt;br /&gt;
				k.notifyAll();&lt;br /&gt;
			}&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep(new Random().nextInt(5000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			synchronized(k) {&lt;br /&gt;
				k.teacherQueue.add(id);&lt;br /&gt;
				System.out.println(&amp;quot;Teacher &amp;quot; + id + &amp;quot; wishes to leave work.&amp;quot;);&lt;br /&gt;
				while(!(k.teacherQueue.element() == id &amp;amp;&amp;amp; Kindergarten.ruleFollowed(k.teachersInside - 1, k.childrenInside, k.capacity))) {&lt;br /&gt;
					try {&lt;br /&gt;
						k.wait();&lt;br /&gt;
					} catch (InterruptedException e) {&lt;br /&gt;
						e.printStackTrace();&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				System.out.println(&amp;quot;Teacher &amp;quot; + id + &amp;quot; has left work.&amp;quot;);&lt;br /&gt;
				k.teachersInside--;&lt;br /&gt;
				k.teacherQueue.remove();&lt;br /&gt;
				k.notifyAll();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Teacher.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ChildCare;&lt;br /&gt;
&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
import java.util.concurrent.ConcurrentLinkedQueue;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class Parent extends Thread {&lt;br /&gt;
	&lt;br /&gt;
	boolean interacted = false;&lt;br /&gt;
	Kindergarten k;&lt;br /&gt;
	int id;&lt;br /&gt;
	public Parent(int id, Kindergarten k) {&lt;br /&gt;
		this.k = k;&lt;br /&gt;
		this.id = id;&lt;br /&gt;
	}&lt;br /&gt;
	public void run() {&lt;br /&gt;
		&lt;br /&gt;
		while(true) {&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep(new Random().nextInt(5000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			int childrenBrought = 1 + new Random().nextInt(4);&lt;br /&gt;
			System.out.println(&amp;quot;Parent &amp;quot; + id + &amp;quot; brought &amp;quot; + childrenBrought + &amp;quot; children.&amp;quot;);&lt;br /&gt;
			interacted = false;&lt;br /&gt;
&lt;br /&gt;
			synchronized(k) {&lt;br /&gt;
				k.parentQueue.add(id);&lt;br /&gt;
				while(!(k.parentQueue.peek() == id &amp;amp;&amp;amp; Kindergarten.ruleFollowed(k.teachersInside, k.childrenInside + childrenBrought, k.capacity))) {&lt;br /&gt;
					try {&lt;br /&gt;
						k.wait();&lt;br /&gt;
					} catch (InterruptedException e) {&lt;br /&gt;
						e.printStackTrace();&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				k.parentQueue.remove();&lt;br /&gt;
				k.childrenInside += childrenBrought;&lt;br /&gt;
				System.out.println(&amp;quot;Parent &amp;quot; + id + &amp;quot; left his &amp;quot; + childrenBrought + &amp;quot; children.&amp;quot;);&lt;br /&gt;
				k.notifyAll();&lt;br /&gt;
			}&lt;br /&gt;
			while(childrenBrought &amp;gt; 0) {&lt;br /&gt;
				try {&lt;br /&gt;
					Thread.sleep(new Random().nextInt(5000));&lt;br /&gt;
				} catch (InterruptedException e) {&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
				int childrenToPickUp = 1 + (1 + new Random().nextInt(4)) % childrenBrought;&lt;br /&gt;
				synchronized(k) {&lt;br /&gt;
					k.childrenInside -= childrenToPickUp;&lt;br /&gt;
					System.out.println(&amp;quot;Parent &amp;quot; + id + &amp;quot; took home his &amp;quot; + childrenToPickUp + &amp;quot;/&amp;quot; + childrenBrought + &amp;quot; children.&amp;quot;);&lt;br /&gt;
					k.notifyAll();&lt;br /&gt;
				}&lt;br /&gt;
				childrenBrought -= childrenToPickUp;&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;/div&gt;</summary>
		<author><name>Mf230002d</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%9B%D0%B0%D0%B1_1_2024&amp;diff=8376</id>
		<title>КДП/Лаб 1 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%9B%D0%B0%D0%B1_1_2024&amp;diff=8376"/>
		<updated>2026-06-01T19:36:48Z</updated>

		<summary type="html">&lt;p&gt;Mf230002d: /* Решење за Child Care */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Прва лабораторијска вежба 2024. године&#039;&#039;&#039; одржана је 29. i 30. априла и носила је 10 бодова (3 бода Moodle 7 бодова задатак). Укупно је било 4 групе. &lt;br /&gt;
&lt;br /&gt;
== Улазни тест Група 1 и 2 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Уколико нит А позове a(), а нит Б позове b(), шта ће се десити са нити Б?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class A {&lt;br /&gt;
	public synchronized void a() {&lt;br /&gt;
		//neki kod ...&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public synchronized void b() {&lt;br /&gt;
		//neki kod..&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	A obj = new A();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одговор: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Зауставиће се док се не изврши a()&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
&lt;br /&gt;
Који од следећег су валидни начини да се иницијализује нит?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;Runnable r = new Runnable() {&lt;br /&gt;
	    public void run(){ /*neki kod*/ }&lt;br /&gt;
	};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Runnable r = new Runnable() {&lt;br /&gt;
		public void run(){ /*neki kod*/}&lt;br /&gt;
	};&lt;br /&gt;
Thread t = new Thread(r);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Thread t = new Thread();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;public class Nit extends Thread {&lt;br /&gt;
	public void run(){ /*neki kod*/ }&lt;br /&gt;
}&lt;br /&gt;
Nit t = new Nit();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Thread t = new Thread() {&lt;br /&gt;
	public void run(){ /*neki kod*/ }&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
&lt;br /&gt;
Прва нит извршава &amp;lt;code&amp;gt;readMethod()&amp;lt;/code&amp;gt; и закључала је &amp;lt;code&amp;gt;readLock&amp;lt;/code&amp;gt;. Друга нит је позвала &amp;lt;code&amp;gt;writeMethod()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class LockExample {&lt;br /&gt;
    private static final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();&lt;br /&gt;
&lt;br /&gt;
    public void readMethod() {&lt;br /&gt;
        rwLock.readLock().lock();&lt;br /&gt;
        try {&lt;br /&gt;
            // Neki kod...&lt;br /&gt;
        } finally {&lt;br /&gt;
            rwLock.readLock().unlock();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void writeMethod() {&lt;br /&gt;
        if (!rwLock.isWriteLocked()) {&lt;br /&gt;
            rwLock.writeLock().lock();&lt;br /&gt;
            try {&lt;br /&gt;
                // Neki kod..&lt;br /&gt;
            } finally {&lt;br /&gt;
                rwLock.writeLock().unlock();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чему служи параметар у конструктору &amp;lt;code&amp;gt;ReentrantReadWriteLock&amp;lt;/code&amp;gt;?&lt;br /&gt;
Одговор: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;FIFO Fairness&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шта се дешава са другом нити?&lt;br /&gt;
Одговор: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Блокира се на &amp;lt;code&amp;gt;writeLock&amp;lt;/code&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Улазни тест Групe 3 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Када нит T увек трајно престаје да се извршава?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# Када нит позове wait над неким објектом.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Када се заврши њена run метода.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Када позове своју interrupt методу.&lt;br /&gt;
# Ниједан од понуђених одговора.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
&lt;br /&gt;
Који од наведених исказа су тачни?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&amp;lt;code&amp;gt;ArrayBlockingQueue&amp;lt;/code&amp;gt; je pogodan za rešavanje ProducerConsumer problema.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;add(E e) i remove()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingQueue&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;putFirst(E e) i takeLast()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingDeque&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;transfer(E e) i take()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;TransferQueue&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;putFirst(E e) i takeFirst()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingDeque&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
&lt;br /&gt;
Уколико нит threadA тренутно извршава методу обј.а(), а потом нит threadB позива методу обј.б(), који од понуђених одговора су тачни, уколико је дат следећи део кода?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class A {&lt;br /&gt;
  private ReentrantReadWriteLock rw = new ReentrantReadWriteLock(true);&lt;br /&gt;
&lt;br /&gt;
  public void a() {&lt;br /&gt;
    try {&lt;br /&gt;
      rw.readLock().lock();&lt;br /&gt;
      // kritična sekcija A...  // &amp;lt;- threadA&lt;br /&gt;
    } finally {&lt;br /&gt;
      rw.readLock().unlock();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public void b() {&lt;br /&gt;
    try {&lt;br /&gt;
      if (rw.getReadLockCount()==0) {&lt;br /&gt;
        rw.writeLock().lock();&lt;br /&gt;
      }&lt;br /&gt;
      // kritična sekcija B...&lt;br /&gt;
    } finally {&lt;br /&gt;
      rw.writeLock().unlock();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
A obj = new A();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; Десиће се грешка приликом извршавања.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Аргумент конструктора ReentrantReadWriteLock означава да могу две нити истовремено да позивају закључавање.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Нити А и Б могу истовремено да извршавају критичне секције у методама a() и b() (респективно).&amp;lt;/span&amp;gt;&lt;br /&gt;
# Нит Б ће бити блокирана док нит А не заврши позив методе a().&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Аргумент конструктора ReentrantReadWriteLock означава да ли ће се буђење нити обављати по FIFO принципу.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Нит Б неће извршити закључавање, јер услов if-a није испуњен.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Улазни тест Групe 4 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
&lt;br /&gt;
Који од следећег су валидни начини да се иницијализује нит?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;Runnable r = new Runnable() {&lt;br /&gt;
	    public void run(){ /*neki kod*/ }&lt;br /&gt;
	};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Runnable r = new Runnable() {&lt;br /&gt;
		public void run(){ /*neki kod*/}&lt;br /&gt;
	};&lt;br /&gt;
Thread t = new Thread(r);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Thread t = new Thread();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;public class Nit extends Thread {&lt;br /&gt;
	public void run(){ /*neki kod*/ }&lt;br /&gt;
}&lt;br /&gt;
Nit t = new Nit();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; class=&amp;quot;solution&amp;quot;&amp;gt;Thread t = new Thread() {&lt;br /&gt;
	public void run(){ /*neki kod*/ }&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
&lt;br /&gt;
Који од наведених исказа су тачни?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&amp;lt;code&amp;gt;ArrayBlockingQueue&amp;lt;/code&amp;gt; je pogodan za rešavanje ProducerConsumer problema.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;add(E e) i remove()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingQueue&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;putFirst(E e) i takeLast()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingDeque&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;transfer(E e) i take()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;TransferQueue&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
# Za implementaciju &amp;lt;code&amp;gt;ProducerConsumer&amp;lt;/code&amp;gt; problema, može se koristiti par metoda &amp;lt;code&amp;gt;putFirst(E e) i takeFirst()&amp;lt;/code&amp;gt; objekta tipa &amp;lt;code&amp;gt;BlockingDeque&amp;lt;/code&amp;gt;, bez dodatnih sinhronizacionih elemenata/direktiva.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
&lt;br /&gt;
Како правилно осигурати међусобно искључивање критичне секције?&lt;br /&gt;
&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Поставка Свих Група==&lt;br /&gt;
&lt;br /&gt;
У зависности од групе било је потребно решити један од следећих проблема:&lt;br /&gt;
&lt;br /&gt;
1. Решити &amp;lt;code&amp;gt;Atomic Broadcast&amp;lt;/code&amp;gt; проблем користећи &amp;lt;code&amp;gt;AtomicInteger&amp;lt;/code&amp;gt; и опционо &amp;lt;code&amp;gt;Semaphore&amp;lt;/code&amp;gt; . Бафер садржи B елемената. Потребно је да програм буде максимално конкурентан и отпоран на прекиде.&lt;br /&gt;
&lt;br /&gt;
2. Решити &amp;lt;code&amp;gt;H2O&amp;lt;/code&amp;gt; проблем користећи &amp;lt;code&amp;gt;CyclicBarrier&amp;lt;/code&amp;gt;. Потребно је да програм буде максимално конкурентан и отпоран на прекиде.&lt;br /&gt;
&lt;br /&gt;
3. Решити &amp;lt;code&amp;gt;Dining Philosophers&amp;lt;/code&amp;gt; проблем користећи &amp;lt;code&amp;gt;AtomicInteger&amp;lt;/code&amp;gt; и регионе. филозофи који су раније изразили жељу за храном треба раније да буду опслужени . Потребно је да програм буде максимално конкурентан и отпоран на прекиде.&lt;br /&gt;
&lt;br /&gt;
4. Решити &amp;lt;code&amp;gt;Child Care&amp;lt;/code&amp;gt; проблем користећи &amp;lt;code&amp;gt;ConcurrentLinkedQueue&amp;lt;/code&amp;gt; и друге произвољне синхронизационе директиве. Родитељ доводи једно или више деце у обданиште и чека све док се не појави место, како би оставио сву децу одједном и отишао. Родитељ може и да одведе једно или више деце, такође одједном. Мора се поштовати редослед доласка родитеља који остављају децу и васпитачица које одлазе са посла. Потребно је да програм буде максимално конкурентан и отпоран на прекиде.&lt;br /&gt;
&lt;br /&gt;
== Решење за Atomic Broadcast ==&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G1;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
&lt;br /&gt;
	private static final int consumersCount=3;&lt;br /&gt;
	private static final int b=5;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
		AtomicInteger[][] reads = new AtomicInteger[b][consumersCount];&lt;br /&gt;
&lt;br /&gt;
		Semaphore mutex = new Semaphore(1);&lt;br /&gt;
&lt;br /&gt;
		AtomicInteger[] buffer = new AtomicInteger[b];&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; buffer.length; i++)&lt;br /&gt;
			buffer[i] = new AtomicInteger(0);&lt;br /&gt;
&lt;br /&gt;
		Consumer[] consumers = new Consumer[consumersCount];&lt;br /&gt;
&lt;br /&gt;
		Producer p = new Producer(consumersCount, buffer, reads,b,mutex);&lt;br /&gt;
		p.start();&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; b; i++)&lt;br /&gt;
			for(int j=0;j&amp;lt;consumersCount;j++)&lt;br /&gt;
				reads[i][j] = new AtomicInteger(1);&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; consumersCount; i++) {&lt;br /&gt;
			consumers[i] = new Consumer(buffer, reads,b,mutex,i);&lt;br /&gt;
			consumers[i].start();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Producer.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G1;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Producer extends Thread {&lt;br /&gt;
&lt;br /&gt;
	private final int consumers;&lt;br /&gt;
	private AtomicInteger[] buffer;&lt;br /&gt;
	private AtomicInteger[][] reads;&lt;br /&gt;
	private Semaphore mutex;&lt;br /&gt;
	private int b;&lt;br /&gt;
&lt;br /&gt;
	public Producer(int consumers, AtomicInteger[] buffer, AtomicInteger[][] reads, int bb, Semaphore mutex) {&lt;br /&gt;
		this.consumers = consumers;&lt;br /&gt;
		this.buffer = buffer;&lt;br /&gt;
		this.reads = reads;&lt;br /&gt;
		b=bb;&lt;br /&gt;
		this.mutex = mutex;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		for (int i = 0; i &amp;lt;b; i++) {&lt;br /&gt;
			for (int j = 0; j &amp;lt; consumers; j++)&lt;br /&gt;
				while(reads[i][j].get() == 0)&lt;br /&gt;
					Thread.onSpinWait();&lt;br /&gt;
&lt;br /&gt;
			int rand = (int)(Math.random() * 10);&lt;br /&gt;
			System.out.println(&amp;quot;Producer produced element: &amp;quot; + rand );&lt;br /&gt;
			mutex.acquireUninterruptibly();&lt;br /&gt;
			buffer[i].set(rand);&lt;br /&gt;
			mutex.release();&lt;br /&gt;
&lt;br /&gt;
			mutex.acquireUninterruptibly();&lt;br /&gt;
			for (int j2 = 0; j2 &amp;lt; consumers; j2++)&lt;br /&gt;
				reads[i][j2].set(0);&lt;br /&gt;
&lt;br /&gt;
			mutex.release();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Consumer.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G1;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Consumer extends Thread {&lt;br /&gt;
&lt;br /&gt;
	private int id;&lt;br /&gt;
	private AtomicInteger[][] reads;&lt;br /&gt;
	private AtomicInteger[] buffer;&lt;br /&gt;
	private Semaphore mutex;&lt;br /&gt;
	private int b;&lt;br /&gt;
&lt;br /&gt;
	public Consumer(AtomicInteger[] buff, AtomicInteger[][] r, int bb,Semaphore mutex, int i) {&lt;br /&gt;
		buffer = buff;&lt;br /&gt;
		reads=r;&lt;br /&gt;
		id=i;&lt;br /&gt;
		this.mutex = mutex;&lt;br /&gt;
		b=bb;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		for (int i = 0; i &amp;lt; b; i++) {&lt;br /&gt;
			while(reads[i][id].get() == 1)&lt;br /&gt;
				Thread.onSpinWait();&lt;br /&gt;
			mutex.acquireUninterruptibly();&lt;br /&gt;
			int elem = buffer[i].get();&lt;br /&gt;
			System.out.println(&amp;quot;Consumer &amp;quot;+id+&amp;quot; consumed element &amp;quot;+elem +&amp;quot;from place &amp;quot;+i);&lt;br /&gt;
			reads[i][id].set(1);&lt;br /&gt;
			mutex.release();&lt;br /&gt;
&lt;br /&gt;
			try {&lt;br /&gt;
				sleep((int)(Math.random()*2000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				throw new RuntimeException(e);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решење за H2O ==&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package H20;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.CyclicBarrier;&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
		int cnt = 10;&lt;br /&gt;
		&lt;br /&gt;
		Barrier barrier = new Barrier(new CyclicBarrier(3));&lt;br /&gt;
		&lt;br /&gt;
		Hydrogen[] h = new Hydrogen[cnt*2];&lt;br /&gt;
		Oxygen[] o = new Oxygen[cnt];&lt;br /&gt;
		&lt;br /&gt;
		for(int i = 0; i &amp;lt; cnt; i++) {&lt;br /&gt;
			o[i] = new Oxygen(barrier);&lt;br /&gt;
			h[2*i] = new Hydrogen(barrier);	&lt;br /&gt;
			h[2*i + 1] = new Hydrogen(barrier);	&lt;br /&gt;
			&lt;br /&gt;
			o[i].start();&lt;br /&gt;
			h[2*i].start();&lt;br /&gt;
			h[2*i+1].start();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;Oxygen.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package H20;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.BrokenBarrierException;&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
&lt;br /&gt;
public class Oxygen extends Thread {&lt;br /&gt;
	&lt;br /&gt;
	Barrier barrier;&lt;br /&gt;
	&lt;br /&gt;
	Oxygen(Barrier b){&lt;br /&gt;
		barrier = b;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep((int)(Math.random() * 4000));&lt;br /&gt;
			} catch (InterruptedException e) {}&lt;br /&gt;
			&lt;br /&gt;
			&lt;br /&gt;
			barrier.oxygen.acquireUninterruptibly();&lt;br /&gt;
&lt;br /&gt;
			barrier.oCount++;&lt;br /&gt;
			&lt;br /&gt;
			try {&lt;br /&gt;
				System.out.println(&amp;quot;Kiseonik pristigao na barijeru&amp;quot;);&lt;br /&gt;
				&lt;br /&gt;
				if(barrier.barrier.await() == 0) {&lt;br /&gt;
					System.out.println(&amp;quot;\nFORMIRANJE VODE!\n&amp;quot;);&lt;br /&gt;
					&lt;br /&gt;
					barrier.hCount = 0;&lt;br /&gt;
					barrier.oCount = 1;&lt;br /&gt;
					&lt;br /&gt;
					barrier.hydrogen.release(2);&lt;br /&gt;
					barrier.oxygen.release(1);&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
			} catch (InterruptedException | BrokenBarrierException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Hydrogen.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package H20;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.BrokenBarrierException;&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
&lt;br /&gt;
public class Hydrogen extends Thread {&lt;br /&gt;
	&lt;br /&gt;
	Barrier barrier;&lt;br /&gt;
	&lt;br /&gt;
	Hydrogen(Barrier b){&lt;br /&gt;
		barrier = b;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep((int)(Math.random() * 4000));&lt;br /&gt;
			} catch (InterruptedException e) {}&lt;br /&gt;
			&lt;br /&gt;
			barrier.hydrogen.acquireUninterruptibly();&lt;br /&gt;
&lt;br /&gt;
			barrier.hCount++;&lt;br /&gt;
			&lt;br /&gt;
			try {&lt;br /&gt;
				System.out.println(&amp;quot;Vodonik pristigao na barijeru&amp;quot;);&lt;br /&gt;
				&lt;br /&gt;
				if(barrier.barrier.await() == 0) {&lt;br /&gt;
					System.out.println(&amp;quot;\nFORMIRANJE VODE!\n&amp;quot;);&lt;br /&gt;
					barrier.hCount = 0;&lt;br /&gt;
					barrier.oCount = 1;&lt;br /&gt;
					&lt;br /&gt;
					barrier.hydrogen.release(2);&lt;br /&gt;
					barrier.oxygen.release(1);&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
			} catch (InterruptedException | BrokenBarrierException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Barrier.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package H20;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.CyclicBarrier;&lt;br /&gt;
import java.util.concurrent.Semaphore;&lt;br /&gt;
&lt;br /&gt;
public class Barrier {&lt;br /&gt;
	CyclicBarrier barrier;&lt;br /&gt;
	Semaphore hydrogen, oxygen;&lt;br /&gt;
	int hCount, oCount;&lt;br /&gt;
	&lt;br /&gt;
	Barrier(CyclicBarrier cb){&lt;br /&gt;
		barrier = cb;&lt;br /&gt;
		hCount = 0;&lt;br /&gt;
		oCount = 0;&lt;br /&gt;
		hydrogen = new Semaphore(2);&lt;br /&gt;
		oxygen = new Semaphore(1);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решење за Dining Philosophers ==&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G3;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
&lt;br /&gt;
	public static final int N = 5;&lt;br /&gt;
&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
		Philosopher[] philosophers = new Philosopher[N];&lt;br /&gt;
		AtomicInteger[] forks = new AtomicInteger[N];&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; forks.length; i++)&lt;br /&gt;
			forks[i] = new AtomicInteger(1);&lt;br /&gt;
&lt;br /&gt;
		Table table = new Table();&lt;br /&gt;
&lt;br /&gt;
		for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
			philosophers[i] = new Philosopher(forks, i, N, table);&lt;br /&gt;
			philosophers[i].start();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;Table.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G3;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Table {&lt;br /&gt;
&lt;br /&gt;
	AtomicInteger ticket;&lt;br /&gt;
	int next;&lt;br /&gt;
&lt;br /&gt;
	public Table() {&lt;br /&gt;
		ticket = new AtomicInteger(0);&lt;br /&gt;
		next = 0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Philosopher.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package rs.ac.bg.etf.kdp.lab12024G3;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.atomic.AtomicInteger;&lt;br /&gt;
&lt;br /&gt;
public class Philosopher extends Thread {&lt;br /&gt;
&lt;br /&gt;
	AtomicInteger[] forks;&lt;br /&gt;
	int id,left,right,N,myTicket;&lt;br /&gt;
	Table t;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public Philosopher(AtomicInteger[] forks, int id, int n,Table table) {&lt;br /&gt;
		this.forks = forks;&lt;br /&gt;
		this.id = id;&lt;br /&gt;
		N = n;&lt;br /&gt;
		left = id;&lt;br /&gt;
		right = (id+1)%n;&lt;br /&gt;
		t = table;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			int choice = (int)(Math.random() * 2);&lt;br /&gt;
&lt;br /&gt;
			switch (choice) {&lt;br /&gt;
			case 0: {&lt;br /&gt;
				eat();&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			case 1:{&lt;br /&gt;
				think();&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			default:&lt;br /&gt;
				throw new IllegalArgumentException(&amp;quot;Unexpected value: &amp;quot; + choice);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public void think() {&lt;br /&gt;
		System.out.println(&amp;quot;Philosopher &amp;quot;+id+&amp;quot; thinking&amp;quot;);&lt;br /&gt;
		try {&lt;br /&gt;
			sleep((int)(Math.random() * 3000));&lt;br /&gt;
		} catch (InterruptedException e) {&lt;br /&gt;
			// TODO Auto-generated catch block&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public void eat() {&lt;br /&gt;
		myTicket = t.ticket.getAndIncrement();&lt;br /&gt;
		synchronized (forks) {&lt;br /&gt;
&lt;br /&gt;
			System.out.println(&amp;quot;Philosopher &amp;quot;+id+&amp;quot; wants to eat&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			while(forks[left].intValue() == 0 || forks[right].intValue() == 0 || myTicket != t.next)&lt;br /&gt;
				try {&lt;br /&gt;
					forks.wait();&lt;br /&gt;
				} catch (InterruptedException e) {&lt;br /&gt;
					// TODO Auto-generated catch block&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			System.out.println(&amp;quot;Philosopher &amp;quot;+id+&amp;quot; started eating&amp;quot;);&lt;br /&gt;
			t.next++;&lt;br /&gt;
			forks[left].set(0);&lt;br /&gt;
			forks[right].set(0);&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			sleep((int)(Math.random() * 2000));&lt;br /&gt;
		} catch (InterruptedException e) {&lt;br /&gt;
			// TODO Auto-generated catch block&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		synchronized (forks) {&lt;br /&gt;
&lt;br /&gt;
			System.out.println(&amp;quot;Philosopher &amp;quot;+id+&amp;quot; finished eating&amp;quot;);&lt;br /&gt;
			forks[left].set(1);&lt;br /&gt;
			forks[right].set(1);&lt;br /&gt;
			forks.notifyAll();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решење за Child Care ==&lt;br /&gt;
== Решење за Dining Philosophers ==&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Test.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ChildCare;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
		Kindergarten k = new Kindergarten(12);&lt;br /&gt;
		k.startProgram(4, 3);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;Kindergarten.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ChildCare;&lt;br /&gt;
&lt;br /&gt;
import java.util.concurrent.ConcurrentLinkedQueue;&lt;br /&gt;
&lt;br /&gt;
public class Kindergarten {&lt;br /&gt;
	int childrenInside = 0;&lt;br /&gt;
	int teachersInside = 0;&lt;br /&gt;
	int capacity;&lt;br /&gt;
	public ConcurrentLinkedQueue&amp;lt;Integer&amp;gt; parentQueue;&lt;br /&gt;
	public ConcurrentLinkedQueue&amp;lt;Integer&amp;gt; teacherQueue;&lt;br /&gt;
	public Kindergarten(int capacity) { &lt;br /&gt;
		parentQueue = new ConcurrentLinkedQueue&amp;lt;Integer&amp;gt;();&lt;br /&gt;
		teacherQueue = new ConcurrentLinkedQueue&amp;lt;Integer&amp;gt;();&lt;br /&gt;
		this.capacity = capacity;&lt;br /&gt;
	}&lt;br /&gt;
	public static boolean ruleFollowed(int teachers, int children, int capacity ) {&lt;br /&gt;
		if(teachers == 0 || children &amp;gt; capacity) return false;&lt;br /&gt;
		return teachers &amp;gt;= Math.ceil(children / 3.0);&lt;br /&gt;
	}&lt;br /&gt;
	public void startProgram(int teachersUsed, int parentsUsed) {&lt;br /&gt;
		Teacher[] teachers = new Teacher[teachersUsed];&lt;br /&gt;
		Parent[] parents = new Parent[parentsUsed];&lt;br /&gt;
		for(int i = 0; i &amp;lt; teachersUsed; i++) {&lt;br /&gt;
			teachers[i] = new Teacher(i, this);&lt;br /&gt;
			teachers[i].start();&lt;br /&gt;
		}&lt;br /&gt;
		for(int i = 0; i &amp;lt; parentsUsed; i++) {&lt;br /&gt;
			parents[i] = new Parent(i, this);&lt;br /&gt;
			parents[i].start();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Teacher.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ChildCare;&lt;br /&gt;
&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
import java.util.concurrent.ConcurrentLinkedQueue;&lt;br /&gt;
&lt;br /&gt;
public class Teacher extends Thread {&lt;br /&gt;
	Kindergarten k;&lt;br /&gt;
	int id;&lt;br /&gt;
	&lt;br /&gt;
	public Teacher(int id, Kindergarten k) {&lt;br /&gt;
		this.k = k;&lt;br /&gt;
		this.id = id;&lt;br /&gt;
	}&lt;br /&gt;
	public void run() {&lt;br /&gt;
		while(true) {&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep(new Random().nextInt(5000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			synchronized(k) {&lt;br /&gt;
				k.teachersInside++;&lt;br /&gt;
				System.out.println(&amp;quot;Teacher &amp;quot; + id + &amp;quot; came to work.&amp;quot;);&lt;br /&gt;
				k.notifyAll();&lt;br /&gt;
			}&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep(new Random().nextInt(5000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			synchronized(k) {&lt;br /&gt;
				k.teacherQueue.add(id);&lt;br /&gt;
				System.out.println(&amp;quot;Teacher &amp;quot; + id + &amp;quot; wishes to leave work.&amp;quot;);&lt;br /&gt;
				while(!(k.teacherQueue.element() == id &amp;amp;&amp;amp; Kindergarten.ruleFollowed(k.teachersInside - 1, k.childrenInside, k.capacity))) {&lt;br /&gt;
					try {&lt;br /&gt;
						k.wait();&lt;br /&gt;
					} catch (InterruptedException e) {&lt;br /&gt;
						e.printStackTrace();&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				System.out.println(&amp;quot;Teacher &amp;quot; + id + &amp;quot; has left work.&amp;quot;);&lt;br /&gt;
				k.teachersInside--;&lt;br /&gt;
				k.teacherQueue.remove();&lt;br /&gt;
				k.notifyAll();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Teacher.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package ChildCare;&lt;br /&gt;
&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
import java.util.concurrent.ConcurrentLinkedQueue;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class Parent extends Thread {&lt;br /&gt;
	&lt;br /&gt;
	boolean interacted = false;&lt;br /&gt;
	Kindergarten k;&lt;br /&gt;
	int id;&lt;br /&gt;
	public Parent(int id, Kindergarten k) {&lt;br /&gt;
		this.k = k;&lt;br /&gt;
		this.id = id;&lt;br /&gt;
	}&lt;br /&gt;
	public void run() {&lt;br /&gt;
		&lt;br /&gt;
		while(true) {&lt;br /&gt;
			try {&lt;br /&gt;
				Thread.sleep(new Random().nextInt(5000));&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
			int childrenBrought = 1 + new Random().nextInt(4);&lt;br /&gt;
			System.out.println(&amp;quot;Parent &amp;quot; + id + &amp;quot; brought &amp;quot; + childrenBrought + &amp;quot; children.&amp;quot;);&lt;br /&gt;
			interacted = false;&lt;br /&gt;
&lt;br /&gt;
			synchronized(k) {&lt;br /&gt;
				k.parentQueue.add(id);&lt;br /&gt;
				while(!(k.parentQueue.peek() == id &amp;amp;&amp;amp; Kindergarten.ruleFollowed(k.teachersInside, k.childrenInside + childrenBrought, k.capacity))) {&lt;br /&gt;
					try {&lt;br /&gt;
						k.wait();&lt;br /&gt;
					} catch (InterruptedException e) {&lt;br /&gt;
						e.printStackTrace();&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				k.parentQueue.remove();&lt;br /&gt;
				k.childrenInside += childrenBrought;&lt;br /&gt;
				System.out.println(&amp;quot;Parent &amp;quot; + id + &amp;quot; left his &amp;quot; + childrenBrought + &amp;quot; children.&amp;quot;);&lt;br /&gt;
				k.notifyAll();&lt;br /&gt;
			}&lt;br /&gt;
			while(childrenBrought &amp;gt; 0) {&lt;br /&gt;
				try {&lt;br /&gt;
					Thread.sleep(new Random().nextInt(5000));&lt;br /&gt;
				} catch (InterruptedException e) {&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
				int childrenToPickUp = 1 + (1 + new Random().nextInt(4)) % childrenBrought;&lt;br /&gt;
				synchronized(k) {&lt;br /&gt;
					k.childrenInside -= childrenToPickUp;&lt;br /&gt;
					System.out.println(&amp;quot;Parent &amp;quot; + id + &amp;quot; took home his &amp;quot; + childrenToPickUp + &amp;quot;/&amp;quot; + childrenBrought + &amp;quot; children.&amp;quot;);&lt;br /&gt;
					k.notifyAll();&lt;br /&gt;
				}&lt;br /&gt;
				childrenBrought -= childrenToPickUp;&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Лабораторијске вежбе]]&lt;/div&gt;</summary>
		<author><name>Mf230002d</name></author>
	</entry>
</feed>