【发布时间】:2021-06-25 03:59:01
【问题描述】:
在下面的代码中,我希望生产者的生产频率应该高于消费者的消费频率,因为生产者线程优先级很高。我希望在输出中看到共享队列不应该经常变空,因为生产者优先级很高。我知道 jvm 线程调度行为并不一致。但是我在这里遗漏了一些概念还是线程优先级对 JVM 真的很重要?
package threading;
import java.util.LinkedList;
import java.util.Queue;
public class InterThreadCommunication {
public static void main(String args[]) {
Queue<Integer> queue = new LinkedList<Integer>();
Producer producer = new Producer(queue, 5);
producer.setPriority(Thread.MAX_PRIORITY);
Consumer consumer = new Consumer(queue, 0);
consumer.setPriority(Thread.NORM_PRIORITY);
producer.start();
consumer.start();
}
}
class Producer extends Thread {
private Queue<Integer> sharedQueue = null;
private int maxCapicity = 0;
private int prdNumber = 0;
public Producer(Queue<Integer> sharedQueue, int maxCapicity) {
this.sharedQueue = sharedQueue;
this.maxCapicity = maxCapicity;
}
public void run() {
while (true) {
synchronized (sharedQueue) {
if (sharedQueue.size() == maxCapicity) {
System.out.println("Producer : Table is full, waiting for consumers to consume");
try {
sharedQueue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
prdNumber++;
sharedQueue.add(prdNumber);
System.out.println("Producer produced = " + prdNumber);
sharedQueue.notify();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class Consumer extends Thread {
private Queue<Integer> sharedQueue = null;
private int minCapicity = 0;
public Consumer(Queue<Integer> sharedQueue, int minCapicity) {
this.sharedQueue = sharedQueue;
this.minCapicity = minCapicity;
}
public void run() {
while (true) {
synchronized (sharedQueue) {
if (sharedQueue.size() == minCapicity) {
System.out.println("Consumer : Table is Empty, waiting for producers to produce");
try {
sharedQueue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int prdNumber = sharedQueue.remove();
System.out.println("Consumer consumed = " + prdNumber);
sharedQueue.notify();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
- Consumer : Table is Empty, waiting for producers to produce
Producer produced = 4
Producer produced = 5
Producer produced = 6
Producer produced = 7
Producer produced = 8
Producer : Table is full, waiting for consumers to consume
Consumer consumed = 4
Consumer consumed = 5
Consumer consumed = 6
Consumer consumed = 7
Consumer consumed = 8
Consumer : Table is Empty, waiting for producers to produce
Producer produced = 9
Producer produced = 10
Producer produced = 11
Producer produced = 12
Producer produced = 13
Producer : Table is full, waiting for consumers to consume
Consumer consumed = 9
Consumer consumed = 10
Consumer consumed = 11
Consumer consumed = 12
Consumer consumed = 13
Consumer : Table is Empty, waiting for producers to produce
Producer produced = 14
Producer produced = 15
Producer produced = 16
Producer produced = 17
Producer produced = 18
Producer : Table is full, waiting for consumers to consume
Consumer consumed = 14
Consumer consumed = 15
Producer produced = 19
Consumer consumed = 16
Producer produced = 20
Consumer consumed = 17
Consumer consumed = 18
Consumer consumed = 19
Consumer consumed = 20
Consumer : Table is Empty, waiting for producers to produce
Producer produced = 21
Producer produced = 22
Producer produced = 23
Producer produced = 24
Producer produced = 25
Producer : Table is full, waiting for consumers to consume
Consumer consumed = 21
Consumer consumed = 22
Consumer consumed = 23
Consumer consumed = 24
Consumer consumed = 25
Consumer : Table is Empty, waiting for producers to produce
【问题讨论】:
标签: java multithreading producer-consumer