Я хочу написать программу с использованием многопоточных методов ожидания и уведомления в Java.
Эта программа имеет стек (max-length = 5). Производитель генерирует число навсегда и помещает его в стек, а потребитель выбирает его из стека.
Когда стек является полным, продюсер должен ждать, и когда стек пуст, потребители должны подождать.
Проблема в том, что она работает только один раз, я имею в виду, что когда она производит 5 номеров, она останавливается, но я помещаю методы запуска в то время как (истинный) блок работает без перехвата, но это не так.
Вот что я пробовал до сих пор.
класс Производитель:производитель - потребитель многопоточность в Java
package trail;
import java.util.Random;
import java.util.Stack;
public class Thread1 implements Runnable {
int result;
Random rand = new Random();
Stack<Integer> A = new Stack<>();
public Thread1(Stack<Integer> A) {
this.A = A;
}
public synchronized void produce()
{
while (A.size() >= 5) {
System.out.println("List is Full");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
result = rand.nextInt(10);
System.out.println(result + " produced ");
A.push(result);
System.out.println(A);
this.notify();
}
@Override
public void run() {
System.out.println("Producer get started");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (true) {
produce();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
И потребитель:
package trail;
import java.util.Stack;
public class Thread2 implements Runnable {
Stack<Integer> A = new Stack<>();
public Thread2(Stack<Integer> A) {
this.A = A;
}
public synchronized void consume() {
while (A.isEmpty()) {
System.err.println("List is empty" + A + A.size());
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.err.println(A.pop() + " Consumed " + A);
this.notify();
}
@Override
public void run() {
System.out.println("New consumer get started");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (true) {
consume();
}
}
}
и здесь является основным методом:
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
Thread1 thread1 = new Thread1(stack);// p
Thread2 thread2 = new Thread2(stack);// c
Thread A = new Thread(thread1);
Thread B = new Thread(thread2);
Thread C = new Thread(thread2);
A.start();
B.start();
C.start();
}
Какой объект вы синхронизируете в продюсере? На каком объекте вы синхронизируете пользователя? –
, пожалуйста, заполните код и удалите пустые строки и те, у которых есть бесполезные комментарии. –
метод prodeuce в классе Thread1 и метод потребления в Thread2-классе синхронизированы. –