Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package zad3;
- class Producent implements Runnable {
- public static boolean dziala = true;
- private Magazyn magazyn;
- public final String nazwa;
- public Producent(String naz, Magazyn mag){
- nazwa = naz;
- magazyn = mag;
- }
- @Override
- public void run(){
- try {
- while(dziala){
- magazyn.wstaw((int) (Math.random() * 10), this.nazwa);
- Thread.sleep((long) (Math.random() * 1000));}
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- //e.printStackTrace();
- }
- }
- /* możliwe zamykanie wątków na siłę
- public void stop() {
- dziala = false;
- }*/
- }
- class Konsument implements Runnable {
- public static boolean dziala = true;
- private Magazyn magazyn;
- public final String nazwa;
- public Konsument(String naz, Magazyn mag) {
- nazwa = naz;
- magazyn = mag;
- }
- @Override
- public void run() {
- try {
- while (dziala) {
- magazyn.usun(this.nazwa);
- Thread.sleep((long) (Math.random() * 1000));
- }
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- //e.printStackTrace();
- }
- /*}
- public void stop() {
- dziala = false;
- }*/
- }
- }
- class Magazyn {
- private int[] tab;
- private int pocz, ile;
- public Magazyn(int n) {
- if (n < 1 || n > 10) throw new IllegalArgumentException("Niewłaściwa pojemność magazynu.");
- tab = new int[n];
- }
- public synchronized boolean pusty() {
- return ile == 0;
- }
- public synchronized boolean pelny() {
- return ile == tab.length;
- }
- public synchronized void wstaw(int x, String n) throws InterruptedException {
- while (pelny()) { //pętla nieskończona jeśli konsument zakończy się pierwszy
- System.out.println(n + " oczekuje na opróżnienie magazynu.");
- wait();}
- tab[(pocz + ile) % tab.length] = x;
- ile++;
- System.out.println(n + " wstawił liczbę " + x + " do magazynu.");
- notifyAll();
- }
- public synchronized int usun(String s) throws InterruptedException {
- while (pusty()) { //pętla nieskończona jeśli producent zakończy się pierwszy
- System.out.println(s + " oczekuje na zapełnienie magazynu.");
- wait();
- }
- int x = tab[pocz];
- pocz = (pocz + 1) % tab.length;
- ile--;
- System.out.println(s + " pobrał liczbę " + x +" z magazynu.");
- notifyAll();
- return x;
- }
- }
- package zad3;
- public class Main {
- public static void main(String[] args) throws InterruptedException {
- System.out.println("=====START=====");
- Magazyn magazyn = new Magazyn(4);
- Thread p1 = new Thread(new Producent("Prod-1", magazyn));
- Thread p2 = new Thread(new Producent("Prod-2", magazyn));
- Thread k1 = new Thread(new Konsument("Kons-1", magazyn));
- Thread k2 = new Thread(new Konsument("Kons-2",magazyn));
- p1.start();
- k1.start();
- p2.start();
- k2.start();
- for (int i = 10; i > 0; i--) {
- Thread.sleep(1000);
- }
- //rozwiązanie nie jest idealne, w przypadku gdy jest więcej producentów niż konsumentów
- //lub odwrotnie
- Producent.dziala = false;
- Konsument.dziala = false;
- p1.interrupt();
- p2.interrupt();
- k1.interrupt();
- k2.interrupt();
- p1.join();
- p2.join();
- k1.join();
- k2.join();
- /* bardzo brzydkie rozwiązanie zamykania wątków na siłę
- p1.stop();
- p2.stop();
- k1.stop();
- k2.stop() */
- System.out.println("=====STOP=====");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement