Добавление с использованием семафоров - PullRequest
0 голосов
/ 04 ноября 2019

Используя как можно меньше семафоров (мне сказали, что вы можете использовать до четырех, и это должно работать), выведите эти числа (не в одном коде): 22, 46, 36

Замена P4 и P1, P2 и P3 и т. Д. Не будет иметь никакого значения для вывода.

Я знаю, как работают семафоры, но буквально не знаю, как их синхронизировать.

Единственное, что может бытьиспользуются X.acquire ();и X.release ();

Изменение кода запрещено .

import java.util.concurrent.Semaphore; 

public class Zad_EP {

        private static int A = 0;
        private static int B = 0;
        private static int C = 3;

        private static final Semaphore NONAME = new Semaphore(1, true);

        public static void main(String[] args) {
            new P1().start();
            new P2().start();
            new P3().start();
            new P4().start();
        }

        private static final class P1 extends Thread {

            @Override
            public void run() {
                try {

                    A = 10;

                    B = B + 5;

                    C = C + A;

                    Thread.sleep(0);
                    System.out.println("Thread P1 is done...");

                } catch (InterruptedException ex) {
                    System.out.println("Ooops...");
                    Thread.currentThread().interrupt();
                    throw new RuntimeException(ex);
                }
            }
        }

        private static final class P2 extends Thread {

            @Override
            public void run() {
                try {

                    B = B + C;

                    A = A + B;

                    Thread.sleep(0);

                    System.out.println("Thread P2 is done...");

                } catch (InterruptedException ex) {
                    System.out.println("Ooops...");
                    Thread.currentThread().interrupt();
                    throw new RuntimeException(ex);
                }
            }
        }

        private static final class P3 extends Thread {

            @Override
            public void run() {
                try {

                    C = B + 10;

                    A = 2 * A;

                    B = B + A;

                    Thread.sleep(0);
                    System.out.println("Thread P3 is done...");

                } catch (InterruptedException ex) {
                    System.out.println("Ooops...");
                    Thread.currentThread().interrupt();
                    throw new RuntimeException(ex);
                }
            }
        }

        private static final class P4 extends Thread {

            @Override
            public void run() {
                try {

                    System.out.println("Sum result: " + A + " + " + B + " + " + C + " = " + (A + B + C));

                    Thread.sleep(0);
                    System.out.println("Thread P4 is done...");

                } catch (InterruptedException ex) {
                    System.out.println("Ooops...");
                    Thread.currentThread().interrupt();
                    throw new RuntimeException(ex);
                }
            }
        }


    }
...