gpt4 book ai didi

java - 关于Java生产者消费者解决方案的问题

转载 作者:行者123 更新时间:2023-12-01 12:11:55 24 4
gpt4 key购买 nike

我目前正在阅读一本书中有关 Java 消费者-生产者解决方案的实现的内容。

public class Producer extends Thread {
private IntBuffer buffer;

public Producer( IntBuffer buffer ){
this.buffer = buffer;
}

public void run(){
Random r = new Random();
while( true ){
int num = r.nextInt();
buffer.add( num );
System.out.println( “Produced “ + num );
}
}
}

public class Consumer extends Thread {
private IntBuffer buffer;

public Consumer( IntBuffer buffer ){
this.buffer = buffer;
}

public void run(){
while( true ){
int num = buffer.remove();
System.out.println( “Consumed “ + num );
}
}
}

public class IntBuffer {
private int index;
private int[] buffer = new int[8];

public void add( int num ){
while( true ){
if( index < buffer.length ){
buffer[index++] = num;
return;
}
}
}

public int remove(){
while( true ){
if( index > 0 ){
return buffer[--index];
}
}
}
}

IntBuffer b = new IntBuffer();
Producer p = new Producer( b );
Consumer c = new Consumer( b );
p.start();
c.start();

我有几个问题:

  1. 根据书中所述,此方法使用繁忙等待。这种情况发生在哪里?据我所知,当一个线程正在等待另一个线程完成其执行然后才能恢复自己的执行时,就会发生忙碌等待。通过使用 wait() 方法,从技术上讲,线程不是仍在等待,直到调用了 notification() 吗?

  2. 为什么同步添加/删除方法不能解决访问控制问题?我认为同步一词会阻止多个线程访问同一代码段。

  3. 为什么添加/删除方法中都有 while( true ) 循环?

最佳答案

  • 本质上,while(true) 的作用是确保一旦缓冲区已满,每个方法都会阻塞,直到调用另一个方法。换句话说,在一个产品被消费者消耗掉之前,生产者将无法生产另一个产品。
  • 它通过不断检查索引值的更改来实现此目的。例如,在 add() 方法中,只要索引不小于 buffer.length,该方法就永远不会返回。相反,它会不断地检查,直到索引小于 buffer.length,这只有在调用remove() 时才会发生。

    1. 这就是一个忙碌的等待。这意味着,您实际上并没有使用等待和通知机制来停放线程,而是使用轮询机制。您会注意到这里没有提及 wait() 和 notification() 方法 - 它只是通过使用 while(true) 来阻止线程。这与轮询端口和打开套接字并异步从服务器接收更新之间的区别没有什么不同。

    2. 因为这些线程故意相互阻塞,所以您无法真正摆脱同步 add() 和 remove() 方法 - 它只会导致死锁。

    关于java - 关于Java生产者消费者解决方案的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27222646/

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