Не работает двоичный семафор на java

222
29 июня 2022, 06:50

Написал программу, которая должна решать задачу: создать задание - решить задание(и так около 100 раз), обязательно использовав два потока и семафор, но почему-то программа не всегда последовательно выполняет что должна(создать задание - решить задание, создать задание - решить задание, и тд, а вместо этого несколько раз создает, а потом его решает). В main() просто вызывается complicatedThreads().

  public static void complicatedThreads(Task t) {
        Semaphore sem=new Semaphore(1);
        Generator genThread=new Generator(t,sem); genThread.setPriority(6);
        Integrator intThread=new Integrator(t,sem);intThread.setPriority(5);
        genThread.start();
        intThread.start();
    }

Генератор заданий:

public class Generator extends Thread {
    private Semaphore sem;
    private Task task;
    public Generator(Task t, Semaphore s) {
        sem = s;
        task = t;
    }
    public void run() {
        int n = task.getNumberOfTasks();
        for (int i = 0; i < n; ++i) {
            try {
                sem.acquire();
                task.setFunction(new Log((1 + (Math.random() * 10))));
                task.setLeftBorder(Math.random() * 100);
                task.setRightBorder(100 + Math.random() * 100);
                task.setDiscretisationStep(Math.random());
                System.out.println("Source <" + task.getLeftBorder() + "> <" + task.getRightBorder() + "> <"
                        + task.getDiscretisationStep() + ">");
                sem.release();
                sleep(1);
            } catch (InterruptedException e) {
                System.out.println("Something gone wrong");
            }
        }
    }
}

То, что эти задания выполняет:

public class Integrator extends Thread{
    private Semaphore sem;
    private Task task;
    public Integrator(Task t, Semaphore s) {
        sem = s;
        task = t;
    }
    public void run() {
        try {
            sleep(1);
        } catch (InterruptedException e1) {}
        int n = task.getNumberOfTasks();
        for (int i = 0; i < n; ++i) {
            try {
                sem.acquire();
                double result = Functions.integrate(task.getFunction(), task.getLeftBorder(), task.getRightBorder(),
                        task.getDiscretisationStep());
                System.out.println("Result <" + task.getLeftBorder() + "> <" + task.getRightBorder() + "> <"
                        + task.getDiscretisationStep() + "> <" + result + ">");
                sem.release(); 
                sleep(1);
            } catch (InterruptedException e) {
                System.out.println("Something gone wrong");
            }
        }
    }
}

По идее, сначала должен выполняться один цикл генератора, потом управление должно переходить к интегратору, то же только на один цикл. Но так происходит только в первые 20-30 раз, потом все идет вперемешку. Ставить больше времени пробовал, делать семафор "честным" то же, так что никак не получается понять, почему проблема возникает и как ее исправить.

READ ALSO
маршрут для робота

маршрут для робота

я делаю игру на java в виде 2д бродилки с видом сверху и также в моей игре есть робот надо запрограммировать робота так чтобы он обходил все преграды...

231
Существует два абзаца, требуется сравнить, вывести список одинаковых слов после сравнения и предложения задом наперед [закрыт]

Существует два абзаца, требуется сравнить, вывести список одинаковых слов после сравнения и предложения задом наперед [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

141
Не вставляется картина в background

Не вставляется картина в background

Проблема с установкой фонового изображения в блок

256
Нужно установить цвет конкретно изображению внутри div не задевая пустой участок вокруг

Нужно установить цвет конкретно изображению внутри div не задевая пустой участок вокруг

Есть с картинкой двери, который находится поверх фонаНужно, чтобы при наведении на дверь конкретно изображение двери окрашивалось в другой...

177