Данная программа представляет собой простую многопоточную программу.По какой-то причине, которую я не могу понять, он застревает в бесконечном цикле обоих методов yield () и потребление () одновременно в обоих потоках.
Он производит вывод несколько раз, а затемнет вывода на консоль.Поэтому я предполагаю, что он застревает в цикле.
Мой вопрос такой, поскольку цикл зависит от значения флага valueSet
одного и того же объекта класса Item, valueSet
не может быть одновременно истинными ложь одновременно.Таким образом, цикл либо метода yield (), либо cosume () должен получить значение false и печать вывода должна продолжиться.
Но этого здесь не происходит.Так почему же он застревает в цикле while, если условие зависит от переменной flag, которая может принимать только true или false одновременно?
class Item{
boolean valueSet = false ;
int item = 0 ;
public void consume(){
while(!valueSet) ;
System.out.println("Consumed : " + item ) ;
valueSet = false ;
}
public void produce(int n ){
while(valueSet);
item = n ;
System.out.println("Produced : " + item ) ;
valueSet = true ;
}
}
class Producer implements Runnable{
Item item ;
Producer(Item itemobj){
item = itemobj ;
}
public void run(){
while(true){
System.out.println("\nProducing ....") ;
item.produce((int)Math.random()*100) ;
}
}
}
class Consumer implements Runnable{
Item item ;
Consumer(Item itemobj){item = itemobj ; }
public void run(){
while(true){
System.out.println("\nConsuming !") ;
item.consume() ;
}
}
}
class Main{
public static void main(String[] args) {
Item item = new Item() ;
Thread consumer = new Thread(new Consumer(item)) ;
Thread producer = new Thread(new Producer(item)) ;
System.out.println("\nStarted producer and consumer threads : ") ;
consumer.start() ;
producer.start() ;
}
}
Обновление:
Когда while(valueSet)
застрял в бесконечном цикле в одном потоке, while(!valuSet)
не должно выйти из цикла и перевернутьvalueSet
?Это может привести к тому, что while(valueSet)
выйдет из цикла, верно?
Согласно некоторым ответам кажется, что когда while(valueSet)
застревает, другой поток как-то не может получить доступ к valueSet
. Я не понимаю, как это происходит.Пожалуйста, объясните свой ответ.
Я вижу, что использование volatile
для valueSet
исправит это, но я не могу понять, как без него.Это вызывает бесконечный цикл, даже если он зависит от одного флага valueSet
, который не может быть истинным и ложным одновременно.