// Path: ThreadSync/src/main/java/ds/producer/FlourProducer.java
// public class FlourProducer extends Thread {
// 
//     private final Silo silo;
// 
//     public FlourProducer(Silo silo) {
//         super("Flour Producer");
//         this.silo = silo;
//     }
// 
//     public void run() {
//         while (true) {
//             try {
//                 sleep((int) (Math.random() * 100));
//             } catch (InterruptedException e) {
//                 e.printStackTrace();
//             }
//             silo.put();
//         }
//     }
// }
// 
// Path: ThreadSync/src/main/java/ds/producer/OilProducer.java
// public class OilProducer extends Thread {
// 
//     private final Silo silo;
// 
//     public OilProducer(Silo silo) {
//         super("Oil Producer");
//         this.silo = silo;
//     }
// 
//     public void run() {
//         while (true) {
//             try {
//                 sleep((int) (Math.random() * 100));
//             } catch (InterruptedException e) {
//                 e.printStackTrace();
//             }
//             silo.put();
//         }
//     }
// }
// 
// Path: ThreadSync/src/main/java/ds/producer/SugarProducer.java
// public class SugarProducer extends Thread {
// 
//     private final Silo silo;
// 
//     public SugarProducer(Silo silo) {
//         super("Sugar Producer");
//         this.silo = silo;
//     }
// 
//     public void run() {
//         while (true) {
//             try {
//                 sleep((int) (Math.random() * 100));
//             } catch (InterruptedException e) {
//                 e.printStackTrace();
//             }
//             silo.put();
//         }
//     }
// }
// 
// Path: ThreadSync/src/main/java/ds/shop/HalvahShop.java
// public class HalvahShop extends Thread {
// 
//     private final Silo oilSilo;
//     private final Silo flourSilo;
//     private final Silo sugarSilo;
// 
//     public HalvahShop(Silo osilo, Silo fsilo, Silo ssilo) {
//         super("Halvah");
//         this.flourSilo = fsilo;
//         this.oilSilo = osilo;
//         this.sugarSilo = ssilo;
//     }
// 
//     public void run() {
//         while (true) {
//             try {
//                 sleep((int) (Math.random() * 100));
//             } catch (InterruptedException e) {
//                 e.printStackTrace();
//             }
//             //2 unit oil
//             oilSilo.get();
//             oilSilo.get();
//             //1 unit flour
//             flourSilo.get();
//             //3 unit sugar
//             sugarSilo.get();
//             sugarSilo.get();
//             sugarSilo.get();
//         }
//     }
// 
// }
// 
// Path: ThreadSync/src/main/java/ds/shop/HotFlakyPastyShop.java
// public class HotFlakyPastyShop extends Thread {
// 
//     private final Silo flourSilo;
//     private final Silo oilSilo;
// 
//     public HotFlakyPastyShop(Silo osilo, Silo fsilo) {
//         super("Hot Flaky Pasty");
//         this.flourSilo = fsilo;
//         this.oilSilo = osilo;
//     }
// 
//     public void run() {
//         while (true) {
//             try {
//                 sleep((int) (Math.random() * 100));
//             } catch (InterruptedException e) {
//                 e.printStackTrace();
//             }
//             //1 unit oil
//             oilSilo.get();
//             //1 unit flour
//             flourSilo.get();
//         }
//     }
// }
// 
// Path: ThreadSync/src/main/java/ds/silo/Silo.java
// public class Silo {
//     //make the producers wait when it exceedes to 20 unit
//     private final String what;
//     private int unit;
// 
//     public Silo(String what) {
//         super();
//         this.what = what;
//     }
// 
//     public synchronized void get() {
//         // we don't have any product at hand
//         while (unit == 0) {
//             try {
//                 wait();
//             } catch (Exception e) {
//                 e.printStackTrace();
//             }
//         }
//         unit--;
//         System.out.println(Thread.currentThread().getName() + " getting " + this.what);
//         notify();
//     }
// 
//     public synchronized void put() {
//         while (unit == 20) {
//             try {
//                 wait();
//             } catch (Exception e) {
//                 e.printStackTrace();
//             }
//         }
//         unit++;
//         System.out.println(Thread.currentThread().getName() + " putting " + this.what);
//         notify();
//     }
// 
//     public String toString() {
//         return what + ":" + unit;
//     }
// }


import ds.producer.FlourProducer;
import ds.producer.OilProducer;
import ds.producer.SugarProducer;
import ds.shop.HalvahShop;
import ds.shop.HotFlakyPastyShop;
import ds.silo.Silo;
package ds;


public class Main {

    public static void main(String[] args) {
        Silo sugarSilo = new Silo("Sugar");
        Silo oilSilo = new Silo("Oil");
        Silo flourSilo = new Silo("Flour");

        new SugarProducer(sugarSilo).start();
        new OilProducer(oilSilo).start();
// Path: ThreadSync/src/main/java/ds/producer/FlourProducer.java
// public class FlourProducer extends Thread {
// 
//     private final Silo silo;
// 
//     public FlourProducer(Silo silo) {
//         super("Flour Producer");
//         this.silo = silo;
//     }
// 
//     public void run() {
//         while (true) {
//             try {
//                 sleep((int) (Math.random() * 100));
//             } catch (InterruptedException e) {
//                 e.printStackTrace();
//             }
//             silo.put();
//         }
//     }
// }
// 
// Path: ThreadSync/src/main/java/ds/producer/OilProducer.java
// public class OilProducer extends Thread {
// 
//     private final Silo silo;
// 
//     public OilProducer(Silo silo) {
//         super("Oil Producer");
//         this.silo = silo;
//     }
// 
//     public void run() {
//         while (true) {
//             try {
//                 sleep((int) (Math.random() * 100));
//             } catch (InterruptedException e) {
//                 e.printStackTrace();
//             }
//             silo.put();
//         }
//     }
// }
// 
// Path: ThreadSync/src/main/java/ds/producer/SugarProducer.java
// public class SugarProducer extends Thread {
// 
//     private final Silo silo;
// 
//     public SugarProducer(Silo silo) {
//         super("Sugar Producer");
//         this.silo = silo;
//     }
// 
//     public void run() {
//         while (true) {
//             try {
//                 sleep((int) (Math.random() * 100));
//             } catch (InterruptedException e) {
//                 e.printStackTrace();
//             }
//             silo.put();
//         }
//     }
// }
// 
// Path: ThreadSync/src/main/java/ds/shop/HalvahShop.java
// public class HalvahShop extends Thread {
// 
//     private final Silo oilSilo;
//     private final Silo flourSilo;
//     private final Silo sugarSilo;
// 
//     public HalvahShop(Silo osilo, Silo fsilo, Silo ssilo) {
//         super("Halvah");
//         this.flourSilo = fsilo;
//         this.oilSilo = osilo;
//         this.sugarSilo = ssilo;
//     }
// 
//     public void run() {
//         while (true) {
//             try {
//                 sleep((int) (Math.random() * 100));
//             } catch (InterruptedException e) {
//                 e.printStackTrace();
//             }
//             //2 unit oil
//             oilSilo.get();
//             oilSilo.get();
//             //1 unit flour
//             flourSilo.get();
//             //3 unit sugar
//             sugarSilo.get();
//             sugarSilo.get();
//             sugarSilo.get();
//         }
//     }
// 
// }
// 
// Path: ThreadSync/src/main/java/ds/shop/HotFlakyPastyShop.java
// public class HotFlakyPastyShop extends Thread {
// 
//     private final Silo flourSilo;
//     private final Silo oilSilo;
// 
//     public HotFlakyPastyShop(Silo osilo, Silo fsilo) {
//         super("Hot Flaky Pasty");
//         this.flourSilo = fsilo;
//         this.oilSilo = osilo;
//     }
// 
//     public void run() {
//         while (true) {
//             try {
//                 sleep((int) (Math.random() * 100));
//             } catch (InterruptedException e) {
//                 e.printStackTrace();
//             }
//             //1 unit oil
//             oilSilo.get();
//             //1 unit flour
//             flourSilo.get();
//         }
//     }
// }
// 
// Path: ThreadSync/src/main/java/ds/silo/Silo.java
// public class Silo {
//     //make the producers wait when it exceedes to 20 unit
//     private final String what;
//     private int unit;
// 
//     public Silo(String what) {
//         super();
//         this.what = what;
//     }
// 
//     public synchronized void get() {
//         // we don't have any product at hand
//         while (unit == 0) {
//             try {
//                 wait();
//             } catch (Exception e) {
//                 e.printStackTrace();
//             }
//         }
//         unit--;
//         System.out.println(Thread.currentThread().getName() + " getting " + this.what);
//         notify();
//     }
// 
//     public synchronized void put() {
//         while (unit == 20) {
//             try {
//                 wait();
//             } catch (Exception e) {
//                 e.printStackTrace();
//             }
//         }
//         unit++;
//         System.out.println(Thread.currentThread().getName() + " putting " + this.what);
//         notify();
//     }
// 
//     public String toString() {
//         return what + ":" + unit;
//     }
// }


// Path: ThreadSync/src/main/java/ds/Main.java
import ds.producer.FlourProducer;
import ds.producer.OilProducer;
import ds.producer.SugarProducer;
import ds.shop.HalvahShop;
import ds.shop.HotFlakyPastyShop;
import ds.silo.Silo;

package ds;


public class Main {

    public static void main(String[] args) {
        Silo sugarSilo = new Silo("Sugar");
        Silo oilSilo = new Silo("Oil");
        Silo flourSilo = new Silo("Flour");

        new SugarProducer(sugarSilo).start();
        new OilProducer(oilSilo).start();
        new FlourProducer(flourSilo).start();