Я написал код для проблемы с производителем-потребителем, где производитель производит товар три раза, а затем потребитель потребляет товар один раз. Приведенный ниже код работает нормально как требование, но основной поток не остановится. Я не знаю, почему это не остановится, я не могу поймать. Не могли бы вы, пожалуйста, взглянуть в нижнем коде и исправить?Проблемы с потребителями-производителями с использованием java-потоков
public class ProducerConsumerProblem
{
public static void main(String[] args)
{
ProducerConsumerStack st = new ProducerConsumerStack();
new ProducerThread(st);
new ConsumerThread(st);
}
}
class ProducerConsumerStack
{
int x;
boolean flag = false;
int producedCount = 0;
public synchronized void push(int x)
{
if (flag)
{ // flag==true
try
{
wait();
}
catch (Exception e)
{
System.out.println(e);
}
}
this.x = x;
System.out.println(x + " is produced..");
try
{
Thread.sleep(250);
}
catch (Exception e)
{
System.out.println(e);
}
this.producedCount++;
if (this.producedCount == 3)
{
this.producedCount = 0;
this.flag = true;
notifyAll();
}
}
synchronized public void pop()
{
if (!flag)
{ // flag==false
try
{
wait();
}
catch (Exception e)
{
System.out.println(e);
}
}
System.out.println(x + " is consumed.\n");
try
{
Thread.sleep(1500);
}
catch (Exception e)
{
System.out.println(e);
}
flag = false;
notify();
}
}
class ProducerThread implements Runnable
{
ProducerConsumerStack st = null;
ProducerThread(ProducerConsumerStack st)
{
this.st = st;
Thread t1 = new Thread(this);
t1.start();
}
public void run()
{
int a = 1;
for (int i = 0; i < 15; i++)
{
st.push(a++);
}
}
}
class ConsumerThread implements Runnable
{
ProducerConsumerStack st = null;
ConsumerThread(ProducerConsumerStack st)
{
this.st = st;
Thread t2 = new Thread(this);
t2.start();
}
public void run()
{
for (int i = 0; i < 15; i++)
{
st.pop();
}
}
}
Я не знаю, почему вы говорите: «основная нить не остановится». Основная() процедура в вашей программе создает три объекта, а затем выходит. Что вы действительно пытаетесь спросить? –
P.S., я вижу потенциальную проблему в вашем коде: там, где конструктор объекта выполняет 'new Thread (this) .start();'. Передача 'this' в другой поток в конструкторе потенциально позволяет новому потоку обращаться к объекту в неинициализированном/не полностью инициализированном состоянии. –
@james large: Пожалуйста, запустите тот же код, а затем посмотрите, завершается ли основная нить или нет. Это совсем не конец. –