关于Java生产者消费者解决方案的问题
我目前正在阅读一本书中关于Java消费生产者解决方案的实现关于Java生产者消费者解决方案的问题,java,multithreading,concurrency,thread-safety,Java,Multithreading,Concurrency,Thread Safety,我目前正在阅读一本书中关于Java消费生产者解决方案的实现 public class Producer extends Thread { private IntBuffer buffer; public Producer( IntBuffer buffer ){ this.buffer = buffer; } public void run(){ Random r = new Random(); while( t
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();
公共类生成器扩展线程{
私有IntBuffer;
公共生产者(IntBuffer){
this.buffer=缓冲区;
}
公开募捐{
随机r=新随机();
while(true){
int num=r.nextInt();
buffer.add(num);
系统输出打印项次(“生成”+num);
}
}
}
公共类使用者扩展线程{
私有IntBuffer;
公共消费者(IntBuffer){
this.buffer=缓冲区;
}
公开募捐{
while(true){
int num=buffer.remove();
系统输出打印项次(“已消耗”+num);
}
}
}
公共类IntBuffer{
私有整数索引;
私有int[]缓冲区=新int[8];
公共无效添加(int num){
while(true){
if(索引0){
返回缓冲区[--索引];
}
}
}
}
IntBuffer b=新的IntBuffer();
生产者p=新生产者(b);
消费者c=新消费者(b);
p、 start();
c、 start();
以下是我的几个问题:
你的
3
回答了你的1
@SotiriosDelimanolis-不是while(true)
只是等待?。我的意思是他不是在等待任何条件实现。@TheLostMind中的if
中的条件,而中的则在中。请注意每个返回
。它只是等待,是的,但也阻止方法返回,直到if()中的条件出现为止语句变为true,此时then子句从while循环和方法中返回。@SotiriosDelimanolis-Ah。我没有正确地看到if
条件。谢谢:)谢谢。现在我理解了代码的忙等待问题。但是,就同步添加和删除方法而言,是什么导致了死锁?即使使用while(true)循环,add方法的block on不是仍然允许remove方法修改bug吗?或者缓冲区数组本身被阻止访问add/remove方法在while(true)循环中吗?最后,我想wait()实际上会释放资源,而不是用while(true)持续占用它循环。如果同步add()和remove()方法,则它们用作锁的共享对象是“this”(IntBuffer的特定实例)。因此,同步可防止在任何线程仍在此类上执行任何同步方法时调用此实例中的任何方法。自调用add()以来阻塞,直到从另一个线程调用remove(),并且synchronized阻止另一个线程进入remove()方法,add()将永远阻塞。