<?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=Ralepop</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=Ralepop"/>
	<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/Ralepop"/>
	<updated>2026-06-04T09:04:53Z</updated>
	<subtitle>Кориснички доприноси</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA:Ralepop&amp;diff=8381</id>
		<title>Корисник:Ralepop</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA:Ralepop&amp;diff=8381"/>
		<updated>2026-06-03T21:06:16Z</updated>

		<summary type="html">&lt;p&gt;Ralepop: Уклоњено преусмерење на Корисник:Elar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;unpaid-lilac-gizmo@duck.com&lt;/div&gt;</summary>
		<author><name>Ralepop</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=8380</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=8380"/>
		<updated>2026-06-03T21:05:14Z</updated>

		<summary type="html">&lt;p&gt;Ralepop: /* Решење за Atomic Broadcast */&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(0);&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() == 1)&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>Ralepop</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA:Ralepop&amp;diff=8208</id>
		<title>Корисник:Ralepop</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA:Ralepop&amp;diff=8208"/>
		<updated>2025-12-06T03:34:48Z</updated>

		<summary type="html">&lt;p&gt;Ralepop: Ralepop преместио је страницу Корисник:Ralepop на Корисник:Elar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#Преусмери [[Корисник:Elar]]&lt;/div&gt;</summary>
		<author><name>Ralepop</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA:Elar&amp;diff=8207</id>
		<title>Корисник:Elar</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA:Elar&amp;diff=8207"/>
		<updated>2025-12-06T03:34:48Z</updated>

		<summary type="html">&lt;p&gt;Ralepop: Ralepop преместио је страницу Корисник:Ralepop на Корисник:Elar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;unpaid-lilac-gizmo@duck.com&lt;/div&gt;</summary>
		<author><name>Ralepop</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA:Elar&amp;diff=8206</id>
		<title>Корисник:Elar</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA:Elar&amp;diff=8206"/>
		<updated>2025-12-06T03:31:40Z</updated>

		<summary type="html">&lt;p&gt;Ralepop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;unpaid-lilac-gizmo@duck.com&lt;/div&gt;</summary>
		<author><name>Ralepop</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D0%BB%D0%B8%D0%B3%D0%B5%D0%BD%D1%82%D0%BD%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8&amp;diff=8204</id>
		<title>Интелигентни системи</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D0%BB%D0%B8%D0%B3%D0%B5%D0%BD%D1%82%D0%BD%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8&amp;diff=8204"/>
		<updated>2025-12-05T20:04:43Z</updated>

		<summary type="html">&lt;p&gt;Ralepop: /* Настава */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| шифра     = 13С113ИС, 13E114ИС&lt;br /&gt;
| семестар  = 5 (СИ), 7&lt;br /&gt;
| статус    = изборни&lt;br /&gt;
| страница  = [http://ri4es.etf.bg.ac.rs/ ri4es.etf.rs]&lt;br /&gt;
| одсек     = СИ, РТИ&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Интелигентни системи&#039;&#039;&#039; је изборни предмет из петог и седмог семестра за СИ, а само седмог за РТИ.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
* [https://jetbrains.com/pycharm/ PyCharm] — развојно окружење за &#039;&#039;Python&#039;&#039;&lt;br /&gt;
* [https://app.box.com/s/0r50je333z1qyypz0h3rm0iqb9s0d64f/folder/38795524647 ETF Materijali (Box)] (рокови)&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
Области су подељене у три блока на предавањима и вежбама, које долазе редом на колоквијумима:&lt;br /&gt;
* &#039;&#039;&#039;Први блок:&#039;&#039;&#039; алгоритми претраживања, методи задовољења ограничења&lt;br /&gt;
* &#039;&#039;&#039;Други блок:&#039;&#039;&#039; теорија игара - симултане игре и секвенцијалне игре, продукциони системи (само на предавањима), рад у неизвесном окружењу&lt;br /&gt;
* &#039;&#039;&#039;Трећи блок:&#039;&#039;&#039; машинско учење (надгледано, ненадгледано и учење са подршком)&lt;br /&gt;
Вежбе су потребне за колоквијуме, домаће задатке и део испита са задацима. Предавања су потребна за део испита са теоријом, али домаћи задаци могу да замене тај део бодова и генерално су занимљивији. Презентације са [http://ri4es.etf.bg.ac.rs/vezbe.html вежби] и [http://ri4es.etf.bg.ac.rs/predavanja.html предавања] су доступна са странице предмета.&lt;br /&gt;
&lt;br /&gt;
== Домаћи ==&lt;br /&gt;
Домаћи задаци на предмету нису обавезни, али могу да замене бодове са теоријског дела испита и тиме ослободе студента од слушања предавања. Имају три домаћа задатка, по један за сваки блок наставе, сваки по 10 бодова. Пошто теорија на испиту носи 20 бодова, студенти морају да бирају која два домаћа задатка ће радити и бранити. Домаћи задаци се раде у &#039;&#039;Python&#039;&#039;. Део окружења који нема везе са суштином задатка је већ дат, и студентима је дато да имплементирају суштину, односно интелигенцију у задатку. Студентима уз поставку буде дата нека врста јавних тестова за своје домаће, док се на одбрани домаћи тестирају са неком врстом тајних тестова чисто како би се проверило да ли они раде ван тестова на којим је студент пробао. Додатан рад на опционалним стварима попут графичког корисничког интерфејса може бити награђен којим бодом преко максимума. Школске 2023/24. године, додатни поени су се добијали за истакнуте перформансе или кроз међусобно тачмичење алгоритама.&lt;br /&gt;
&lt;br /&gt;
Стари домаћи задаци доступни су са [http://ri4es.etf.bg.ac.rs/projekat.html странице предмета].&lt;br /&gt;
&lt;br /&gt;
Примери модификација за домаће задатке из школске 2023/24 се могу се наћи на [[Интелигентни_системи/Домаћи_2023|следећој страници]].&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
На страници предмета нису доступни старији рокови, јер су задаци који су били релевантни са старих рокова издвојени на презентације са вежби. Неки старији рокови се могу наћи на драјву у одељку за [[#Корисне везе|корисне везе]].&lt;br /&gt;
&lt;br /&gt;
=== Колоквијум 1===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = Интелигентни_системи/К1&lt;br /&gt;
| noresultsheader = Тренутно нема сачуваних рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦22¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Колоквијум 2===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = Интелигентни_системи/К2&lt;br /&gt;
| noresultsheader = Тренутно нема сачуваних рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦22¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Колоквијум ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = Интелигентни_системи/К&lt;br /&gt;
| noresultsheader = Тренутно нема сачуваних рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦22¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Испит ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = Интелигентни_системи/.* \d+$&lt;br /&gt;
| nottitleregexp  = Интелигентни_системи/К\d&lt;br /&gt;
| nottitleregexp  = Интелигентни_системи/К&lt;br /&gt;
| nottitleregexp  = Интелигентни_системи/Домаћи&lt;br /&gt;
| noresultsheader = Тренутно нема сачуваних рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦22¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;K_2&amp;lt;/math&amp;gt; — бодови са првог и другог колоквијума (0-25, могу се поправити у сваком року с тим што освојени бодови на поправкама важе само у року у којем је рађена поправка) - на РТИ ово представља један колоквијум који вреди 50 поена&lt;br /&gt;
* &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; — укупни бодови са домаћих задатака (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — бодови са трећег колоквијума, односно делу испита са задацима (0-30)&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — бодови са теоријског дела испита (0-20), ако је започето решавање, гледа се само то&lt;br /&gt;
* Бодови: &amp;lt;math&amp;gt;P = K_1 + K_2 + OR \left(T, D\right) + I&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У сваком року могуће је радити било коју комбинацију [К1+К2+И, К1+И, К2+И, И, К+И] и уз сваки од њих могуће је радити теорију која мења домаће задатке. Ако се ради теорија, она у потпуности мења домаће задатке (није могуће радити један домаћи и једно теоријско питање). &#039;&#039;&#039;Поени ни са једног дела испита се не преносе у наредне испитне рокове, која год комбинација да се ради.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{zadaci|postavke}}&lt;/div&gt;</summary>
		<author><name>Ralepop</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA:Elar&amp;diff=8203</id>
		<title>Корисник:Elar</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA:Elar&amp;diff=8203"/>
		<updated>2025-12-05T00:00:38Z</updated>

		<summary type="html">&lt;p&gt;Ralepop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;rale@keemail.me&lt;/div&gt;</summary>
		<author><name>Ralepop</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA:Elar&amp;diff=7941</id>
		<title>Корисник:Elar</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA:Elar&amp;diff=7941"/>
		<updated>2025-08-17T23:41:25Z</updated>

		<summary type="html">&lt;p&gt;Ralepop: Нова страница: SI&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SI&lt;/div&gt;</summary>
		<author><name>Ralepop</name></author>
	</entry>
</feed>