gpt4 book ai didi

java - 生产者-消费者线程死锁

转载 作者:行者123 更新时间:2023-12-01 18:10:02 26 4
gpt4 key购买 nike

我遇到“生产者 - 消费者任务”中可能出现死锁的问题。一切都应该按以下方式进行:

  1. 生产者应该生成 int[] 数组并将其添加到集合中
  2. 消费者应该获取这些数组,将它们放入第二个集合并在输出中打印

在 Debug模式下,我注意到一段时间后,两个任务都在 this.wait(); 方法上暂停。

您能帮我解释一下这段代码有什么问题吗? :)
谢谢!

生产者任务类

public class ProducerTask extends Thread{

private static final Object bufforLock = new Object();
private static LinkedList<Integer[]> buffor;

public ProducerTask(){
if(buffor == null)
buffor = new LinkedList<>();
this.setName("@ProducerTask");
}

@Override
public void run() {
synchronized (this) {
try {
for (int i = 0; i < 100; i++) {
while (isBufforFull()) {
System.err.println("ProducerTask is waiting");
this.wait();
}
Integer[] randomIntArray = getRandomIntArray();

addToBuffor(randomIntArray);
}
}
catch (InterruptedException ex) {
}
}
}

public static void removeLast(){
synchronized(bufforLock){
buffor.removeLast();
bufforLock.notifyAll();
}
}

public static Integer[] getLast(){
synchronized(bufforLock){
return buffor.getLast();
}
}

public static boolean isBufforFull(){
synchronized(bufforLock){
return buffor.size() == 10;
}
}

public static boolean isBufforEmpty(){
synchronized(bufforLock){
return buffor.isEmpty();
}
}

public static void addToBuffor(Integer[] array){
synchronized(bufforLock){
buffor.addFirst(array);
bufforLock.notifyAll();
}
}

public static LinkedList<Integer[]> getBuffor(){
synchronized(bufforLock){
return buffor;
}
}

private Integer[] getRandomIntArray(){
int maxSize = 10;
Integer[] array = new Integer[maxSize];
for(int i = 0 ; i < maxSize ; i++){
int value = (int) (Math.random() * 100);
array[i] = Integer.valueOf(value);
}
return array;
}
}

消费者任务类

public class ConsumerTask extends Thread {

private static LinkedList<Integer[]> buffor;

public ConsumerTask() {
if (buffor == null) {
buffor = new LinkedList<>();
}
this.setName("@ConsumerTask");
}

@Override
public void run() {
synchronized (this) {
try {
while (true) {
while (ProducerTask.isBufforEmpty()) {
System.err.println("ConsumerTask is waiting");
this.wait();
}

Integer[] array = ProducerTask.getLast();
this.arraySortByInserting(array);
this.buffor.addFirst(array);
ProducerTask.removeLast();
}
}
catch (InterruptedException ex) {}
}
}

private Integer[] arraySortByInserting(Integer[] aArrayToSort) {

if(aArrayToSort == null || aArrayToSort.length == 0)
return null;

this.printArray(aArrayToSort, "Array before sorting");

for (int i = 1; i < aArrayToSort.length; i++) {
int intValue = aArrayToSort[i];
int j = i;
while ((j > 0) && (aArrayToSort[j - 1] > intValue)) {
aArrayToSort[j] = aArrayToSort[j - 1];
j--;
}
aArrayToSort[j] = intValue;
}


this.printArray(aArrayToSort, "Array after sorting");

return aArrayToSort;
}

private void printArray(Integer[] aArray, String aMessage) {

System.out.print(aMessage + " [");

for (int intElement : aArray) {
System.out.print(intElement + " ");
}

System.out.print("]");
System.out.println();
}
}

最佳答案

您需要一个用于线程间通信的公共(public)对象。

现在,您正在使用 this 作为您获得锁定的对象,并在生产者线程中通知 bufferLock,这同样适用于消费者线程。

请记住,两者是两个不同的实例,并且都成功获得了单个对象的锁定,然后都进入等待状态。

关于java - 生产者-消费者线程死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33721717/

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