S
Sunitha Kumar
Hi,
I've implemented a Fixed Queue that contains even and odd Integers with one
each EvenProducer, EvenConsumer. OddProducer, OddConsumer threads, all
capable of producing and consuming ten even or odd Integers each. My problem
is that my threads stop consuming after a certain point (the 7th iteration,
according to my debugger) and I can't figure out why. (I've used different
sleep times, synchronized all methods to no avail.)
I've attached my code below:
/**
* EvenConsumer
* @
*/
public class EvenConsumer extends Thread
{
private FixedQueue queue;
private int number;
private int workCount;
public EvenConsumer(FixedQueue q, int i)
{
this.queue= q;
this.number= i;
}
public void run()
{
try
{
for (int i= 0; i < 10; i++)
{
Integer value= queue.evenDequeue();
System.out.println(
"Even Consumer #" + this.number + " removed " + value);
System.out.println(queue.toString());
trackWorkPerformance(i);
sleep((int) (Math.random() * 20));
}
generatePerformanceReport(this.workCount);
}
catch (InterruptedException e)
{
}
}
private void trackWorkPerformance(int i)
{
workCount= i + 1;
}
private void generatePerformanceReport(int workCount)
{
System.out.println(
"Even Consumer #"
+ this.number
+ " has been working "
+ workCount
+ " times.");
}
}
/**
* EvenProducer
* @ Places randomly generated even Integer objects into
* the rear of a FixedQueue.
*/
public class EvenProducer extends Thread
{
private FixedQueue queue;
private int number;
private int workCount;
public EvenProducer(FixedQueue q, int i)
{
this.queue= q;
this.number= i;
}
public void run()
{
try
{
for (int i= 0; i < 10; i++)
{
int value= Random.nextEvenInt();
queue.evenEnqueue(new Integer(value));
//System.out.println(value);
System.out.println(
"Even Producer #" + this.number + " put " + value);
System.out.println(queue.toString());
trackWorkPerformance(i);
sleep((int) (Math.random() * 30));
}
generatePerformanceReport(this.workCount);
}
catch (InterruptedException e)
{
}
}
private void trackWorkPerformance(int i)
{
workCount= i + 1;
}
private void generatePerformanceReport(int workCount)
{
System.out.println(
"Even Producer #"
+ this.number
+ " has been working "
+ workCount
+ " times.");
}
}
/**
* OddConsumer
* @
*/
public class OddConsumer extends Thread
{
private FixedQueue queue;
private int number;
private int workCount;
public OddConsumer(FixedQueue q, int i)
{
this.queue= q;
this.number= i;
}
public void run()
{
try
{
for (int i= 0; i < 10; i++)
{
Integer value= queue.oddDequeue();
System.out.println(
"Odd Consumer #" + this.number + " removed " + value);
System.out.println(queue.toString());
trackWorkPerformance(i);
sleep((int) (Math.random() * 10));
}
generatePerformanceReport(this.workCount);
}
catch (InterruptedException e)
{
}
}
private void trackWorkPerformance(int i)
{
workCount= i + 1;
}
private void generatePerformanceReport(int workCount)
{
System.out.println(
"Odd Consumer #"
+ this.number
+ " has been working "
+ workCount
+ " times.");
}
}
/**
* OddProducer
* @
*/
public class OddProducer extends Thread
{
private FixedQueue queue;
private int workCount;
private int number;
public OddProducer(FixedQueue q, int i)
{
this.queue= q;
this.number= i;
}
public void run()
{
try
{
for (int i= 0; i < 10; i++)
{
int value= Random.nextOddInt();
queue.oddEnqueue(new Integer(value));
//System.out.println(value);
System.out.println(
"OddProducer #" + this.number + " put " + value);
System.out.println(queue.toString());
trackWorkPerformance(i);
sleep((int) (Math.random() * 10));
}
generatePerformanceReport(this.workCount);
}
catch (InterruptedException e)
{
}
}
private void trackWorkPerformance(int i)
{
workCount = i+1;
}
private void generatePerformanceReport(int workCount)
{
System.out.println(
"Odd Producer #"
+ this.number
+ " has been working "
+ workCount
+ " times.");
}
}
/**
* FixedQueue
* @
*/
public class FixedQueue
{
private static FixedQueue singleton= new FixedQueue();
private boolean evenAvailable= false;
private Integer num, value;
private boolean oddAvailable= false;
private final LinkedList queue= new LinkedList();
private int queueSize= 5;
public synchronized Integer evenDequeue() throws InterruptedException
{
while ((evenAvailable == false) || (isEmpty()) || (isOdd()))
{
wait();
}
value= (Integer) queue.removeFirst();
evenAvailable= false;
notifyAll();
return value;
}
public synchronized void evenEnqueue(Integer i) throws
InterruptedException
{
while (isFull())
{
wait();
}
queue.addLast(i);
evenAvailable= true;
notifyAll();
}
/**
* @param num
* @return
*/
private synchronized boolean isEven()
{
Integer value= (Integer) queue.get(0);
return value.intValue() % 2 == 0;
}
private synchronized boolean isFull()
{
return (queueSize == queue.size());
}
public synchronized boolean isEmpty()
{
return (queue.size() == 0);
}
public synchronized boolean isOdd()
{
Integer value= (Integer) queue.get(0);
return value.intValue() % 2 == 1;
}
public synchronized Integer oddDequeue()
{
while ((oddAvailable == false) || (isEmpty()) || (isEven()))
{
try
{
wait();
}
catch (InterruptedException e)
{
}
}
value= (Integer) queue.removeFirst();
oddAvailable= false;
notifyAll();
return value;
}
public synchronized void oddEnqueue(Integer i)
{
while (isFull())
{
try
{
wait();
}
catch (InterruptedException e)
{
}
}
queue.addLast(i);
oddAvailable= true;
notifyAll();
}
public synchronized String toString()
{
return queue.toString();
}
}
/**
* Random
* @ Generates random odd and even int numbers.
*/
public class Random
{
private static final java.util.Random RAND= new java.util.Random();
private static final int EVEN_MASK= -2;
private static final int ODD_MASK= 1;
public static synchronized int nextEvenInt()
{
return RAND.nextInt() & EVEN_MASK;
}
public static synchronized int nextOddInt()
{
return RAND.nextInt() | ODD_MASK;
}
}
/**
* QueueException
* @
*/
public class QueueException extends Exception
{
/**
*
*/
public QueueException()
{
super();
}
}
Any help would be appreciated!
Thanks,
Sunitha
I've implemented a Fixed Queue that contains even and odd Integers with one
each EvenProducer, EvenConsumer. OddProducer, OddConsumer threads, all
capable of producing and consuming ten even or odd Integers each. My problem
is that my threads stop consuming after a certain point (the 7th iteration,
according to my debugger) and I can't figure out why. (I've used different
sleep times, synchronized all methods to no avail.)
I've attached my code below:
/**
* EvenConsumer
* @
*/
public class EvenConsumer extends Thread
{
private FixedQueue queue;
private int number;
private int workCount;
public EvenConsumer(FixedQueue q, int i)
{
this.queue= q;
this.number= i;
}
public void run()
{
try
{
for (int i= 0; i < 10; i++)
{
Integer value= queue.evenDequeue();
System.out.println(
"Even Consumer #" + this.number + " removed " + value);
System.out.println(queue.toString());
trackWorkPerformance(i);
sleep((int) (Math.random() * 20));
}
generatePerformanceReport(this.workCount);
}
catch (InterruptedException e)
{
}
}
private void trackWorkPerformance(int i)
{
workCount= i + 1;
}
private void generatePerformanceReport(int workCount)
{
System.out.println(
"Even Consumer #"
+ this.number
+ " has been working "
+ workCount
+ " times.");
}
}
/**
* EvenProducer
* @ Places randomly generated even Integer objects into
* the rear of a FixedQueue.
*/
public class EvenProducer extends Thread
{
private FixedQueue queue;
private int number;
private int workCount;
public EvenProducer(FixedQueue q, int i)
{
this.queue= q;
this.number= i;
}
public void run()
{
try
{
for (int i= 0; i < 10; i++)
{
int value= Random.nextEvenInt();
queue.evenEnqueue(new Integer(value));
//System.out.println(value);
System.out.println(
"Even Producer #" + this.number + " put " + value);
System.out.println(queue.toString());
trackWorkPerformance(i);
sleep((int) (Math.random() * 30));
}
generatePerformanceReport(this.workCount);
}
catch (InterruptedException e)
{
}
}
private void trackWorkPerformance(int i)
{
workCount= i + 1;
}
private void generatePerformanceReport(int workCount)
{
System.out.println(
"Even Producer #"
+ this.number
+ " has been working "
+ workCount
+ " times.");
}
}
/**
* OddConsumer
* @
*/
public class OddConsumer extends Thread
{
private FixedQueue queue;
private int number;
private int workCount;
public OddConsumer(FixedQueue q, int i)
{
this.queue= q;
this.number= i;
}
public void run()
{
try
{
for (int i= 0; i < 10; i++)
{
Integer value= queue.oddDequeue();
System.out.println(
"Odd Consumer #" + this.number + " removed " + value);
System.out.println(queue.toString());
trackWorkPerformance(i);
sleep((int) (Math.random() * 10));
}
generatePerformanceReport(this.workCount);
}
catch (InterruptedException e)
{
}
}
private void trackWorkPerformance(int i)
{
workCount= i + 1;
}
private void generatePerformanceReport(int workCount)
{
System.out.println(
"Odd Consumer #"
+ this.number
+ " has been working "
+ workCount
+ " times.");
}
}
/**
* OddProducer
* @
*/
public class OddProducer extends Thread
{
private FixedQueue queue;
private int workCount;
private int number;
public OddProducer(FixedQueue q, int i)
{
this.queue= q;
this.number= i;
}
public void run()
{
try
{
for (int i= 0; i < 10; i++)
{
int value= Random.nextOddInt();
queue.oddEnqueue(new Integer(value));
//System.out.println(value);
System.out.println(
"OddProducer #" + this.number + " put " + value);
System.out.println(queue.toString());
trackWorkPerformance(i);
sleep((int) (Math.random() * 10));
}
generatePerformanceReport(this.workCount);
}
catch (InterruptedException e)
{
}
}
private void trackWorkPerformance(int i)
{
workCount = i+1;
}
private void generatePerformanceReport(int workCount)
{
System.out.println(
"Odd Producer #"
+ this.number
+ " has been working "
+ workCount
+ " times.");
}
}
/**
* FixedQueue
* @
*/
public class FixedQueue
{
private static FixedQueue singleton= new FixedQueue();
private boolean evenAvailable= false;
private Integer num, value;
private boolean oddAvailable= false;
private final LinkedList queue= new LinkedList();
private int queueSize= 5;
public synchronized Integer evenDequeue() throws InterruptedException
{
while ((evenAvailable == false) || (isEmpty()) || (isOdd()))
{
wait();
}
value= (Integer) queue.removeFirst();
evenAvailable= false;
notifyAll();
return value;
}
public synchronized void evenEnqueue(Integer i) throws
InterruptedException
{
while (isFull())
{
wait();
}
queue.addLast(i);
evenAvailable= true;
notifyAll();
}
/**
* @param num
* @return
*/
private synchronized boolean isEven()
{
Integer value= (Integer) queue.get(0);
return value.intValue() % 2 == 0;
}
private synchronized boolean isFull()
{
return (queueSize == queue.size());
}
public synchronized boolean isEmpty()
{
return (queue.size() == 0);
}
public synchronized boolean isOdd()
{
Integer value= (Integer) queue.get(0);
return value.intValue() % 2 == 1;
}
public synchronized Integer oddDequeue()
{
while ((oddAvailable == false) || (isEmpty()) || (isEven()))
{
try
{
wait();
}
catch (InterruptedException e)
{
}
}
value= (Integer) queue.removeFirst();
oddAvailable= false;
notifyAll();
return value;
}
public synchronized void oddEnqueue(Integer i)
{
while (isFull())
{
try
{
wait();
}
catch (InterruptedException e)
{
}
}
queue.addLast(i);
oddAvailable= true;
notifyAll();
}
public synchronized String toString()
{
return queue.toString();
}
}
/**
* Random
* @ Generates random odd and even int numbers.
*/
public class Random
{
private static final java.util.Random RAND= new java.util.Random();
private static final int EVEN_MASK= -2;
private static final int ODD_MASK= 1;
public static synchronized int nextEvenInt()
{
return RAND.nextInt() & EVEN_MASK;
}
public static synchronized int nextOddInt()
{
return RAND.nextInt() | ODD_MASK;
}
}
/**
* QueueException
* @
*/
public class QueueException extends Exception
{
/**
*
*/
public QueueException()
{
super();
}
}
Any help would be appreciated!
Thanks,
Sunitha