Написал программу, которая должна решать задачу: создать задание - решить задание(и так около 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 раз, потом все идет вперемешку. Ставить больше времени пробовал, делать семафор "честным" то же, так что никак не получается понять, почему проблема возникает и как ее исправить.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
я делаю игру на java в виде 2д бродилки с видом сверху и также в моей игре есть робот надо запрограммировать робота так чтобы он обходил все преграды...
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение
Есть с картинкой двери, который находится поверх фонаНужно, чтобы при наведении на дверь конкретно изображение двери окрашивалось в другой...