class Producer implements Runnable{ //producer job here
Vector<Integer> sQueue;
public Producer(Vector<Integer> queue) {
this.sQueue=queue;
}
public void run(){
int i=0;
try{
synchronized(sQueue){
for(i=0;i<30;i++){
if(sQueue.size()<15){
System.out.println("Producer producing the item:-"+i);
sQueue.add(i);
sQueue.notifyAll();
}
else
{ sQueue.notifyAll();
sQueue.wait();
}
}
}
}
catch(Exception e){
e.printStackTrace();
}
}
}
class Consumer implements Runnable{
Vector<Integer> sQueue;
public Consumer(Vector<Integer> queue) {
this.sQueue=queue;
}
public void run(){
int i=0;
try{
synchronized(sQueue){
while(true){
if(sQueue.size()>0){
System.out.println("Consumer is removing the item:-");
int item=sQueue.remove(0);
System.out.println(item);
sQueue.notifyAll();
Thread.sleep(1000);
}
else
{
sQueue.wait();
}
}
}
}
catch(Exception e){
e.printStackTrace();
}
}
}
public class ProducerConsumerProblem {
public static void main(String [] arg){
Vector<Integer> sQueue;
sQueue = new Vector<>(15);
Producer p=new Producer(sQueue);
Consumer c=new Consumer(sQueue);
Thread producer=new Thread(p);
Thread consumer=new Thread(c);
producer.start();
consumer.start();
}
}
上記のコードでは、私は、Javaマルチスレッドの助けを借りてプロデューサ消費者の問題をシミュレートしようとしています。私は私が間違っている、生産者スレッドと消費者のスレッドがインターリーブされていない何が起こっているか知らない整数である共有キューとしてSQUEUEを使用しています、ここコードには何が問題なのですか?スレッドがインターリーブしないのはなぜですか?
----------------------------output------------------------
Producer producing the item:-0
Producer producing the item:-1
Producer producing the item:-2
Producer producing the item:-3
Producer producing the item:-4
Producer producing the item:-5
Producer producing the item:-6
Producer producing the item:-7
Producer producing the item:-8
Producer producing the item:-9
Producer producing the item:-10
Producer producing the item:-11
Producer producing the item:-12
Producer producing the item:-13
Producer producing the item:-14
Consumer is removing the item:-
0
Consumer is removing the item:-
1
Consumer is removing the item:-
2
Consumer is removing the item:-
3
Consumer is removing the item:-
4
Consumer is removing the item:-
5
Consumer is removing the item:-
6
Consumer is removing the item:-
7
Consumer is removing the item:-
8
Consumer is removing the item:-
9
Consumer is removing the item:-
10
Consumer is removing the item:-
11
Consumer is removing the item:-
12
Consumer is removing the item:-
13
Consumer is removing the item:-
14
Producer producing the item:-16
Producer producing the item:-17
Producer producing the item:-18
Producer producing the item:-19
Producer producing the item:-20
Producer producing the item:-21
Producer producing the item:-22
Producer producing the item:-23
Producer producing the item:-24
Producer producing the item:-25
Producer producing the item:-26
Producer producing the item:-27
Producer producing the item:-28
Producer producing the item:-29
Consumer is removing the item:-
16
Consumer is removing the item:-
17
Consumer is removing the item:-
18
Consumer is removing the item:-
19
Consumer is removing the item:-
20
Consumer is removing the item:-
21
Consumer is removing the item:-
22
Consumer is removing the item:-
23
Consumer is removing the item:-
24
Consumer is removing the item:-
25
Consumer is removing the item:-
26
Consumer is removing the item:-
27
Consumer is removing the item:-
28
Consumer is removing the item:-
29
あなたは正確に何を期待していますか?それは明確ではない –
上記の出力では、消費者スレッドまたはプロデューサスレッドがwait()メソッドによってブロックされるまで、notifyAll()を呼び出した後でもインターリーブされないことがわかりますが、 –