gpt4 book ai didi

java - 代码有什么问题吗?为什么线程不交错?

转载 作者:行者123 更新时间:2023-12-01 09:35:20 25 4
gpt4 key购买 nike

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

最佳答案

您的方法是同步的。当Producer启动时,它会获得队列上的锁,并且在完成之前不会释放它。当您的消费者启动时,它会等待直到可以获得锁。如果您希望它们交错,请不要同步...synchronized 关键字专门用于防止交错。

关于java - 代码有什么问题吗?为什么线程不交错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39023140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com