Skip to Main Content

New to Java

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Multithreading - Problem with notifyAll() and wait()

807598Oct 12 2006 — edited Oct 13 2006
I have a program which has 2 threads: producer and consumer. Producer sleeps, wakes up and outputs how long it slept and what time it woke up. That info is passed to a vector. Consumer then gets that info from the vector and prints it out. Well, at least that's what it should do.

Right now it gives me a runtime error because it doesn't like the NotifyAll() and wait() statements (producer notifies and consumer waits). It gives me an IllegalMonitorStateException for both - notify and wait, saying that "current thread is not the owner."

Can anyone tell me what is wrong with this? I really have no idea.
// Import libraries
import java.util.Random;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.Vector;

public class Assignment3b
{	
	private Queue queue = new Queue();
	Vector vectorQueue = new Vector();
	String eventInfo;
	
	// Create threads:
	private ProducerThread producer = new ProducerThread();
	private ConsumerThread consumer = new ConsumerThread();

	
	/** Main method */
	public static void main(String[] args)
	{
		new Assignment3b();		
	}
	
	public Assignment3b()
	{			
		// Start threads
		producer.start();
		consumer.start();
		
	}/* End Main method */
	
	
	/** Method to get time of an event */
	public String getTimeOfEvent() 
	{
	    // Make a new Date object, which will be initialized to the current time
	    Date now = new Date();
	
	    // This will output the hour (0-12), minutes, seconds, milliseconds,
	    // and the am/pm marker. 
	    SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss:SS a");
	
	    String outputTime = format.format(now);
	    
	    return outputTime;
	} /* End of getTimeOfEvent method */

	
	/************************* Producer Thread ********************************/
	class ProducerThread extends Thread
	{
		int sleepTime;
		String wakeTime;
		
		public void run()
		{		 	
			while(true)
			{		 		
			 	// Interrupt Consumer thread
			  	consumer.interrupt();	
				
				// Loop Producer thread 10 times
				for (int count = 0; count < 10; count++)
				{
					// Generate random number between 10 and 2000
			        sleepTime = (int)(2000.0 * Math.random()) + 10;
					
					// Put the thread to sleep for a random 
					// amount of milliseconds
				  	try
				  	{
				  		Thread.sleep(sleepTime);	
				  	}
				  	
				  	catch(InterruptedException ex)
				  	{
				  		ex.printStackTrace();
				  	}	
	
				  	// Save the time when producer woke up
				  	wakeTime = getTimeOfEvent();
				  	
				  	// Store both times into a variable
				  	eventInfo = "\nProducer slept for " + sleepTime + 
				  		" milliseconds, and woke up at " + wakeTime;	 		
					
					// Store the event information in the vector
					queue.storeEventInfo(eventInfo);
					
				  	// Wake up the consumer thread
				  	notifyAll();
				}
			}
		}
	}
	
	
	/************************* Consumer Thread ********************************/
	class ConsumerThread extends Thread
	{
		public void run()
		{
			try
			{
				// Make the thread wait while the queue is empty
				while(vectorQueue.isEmpty())
				{
					wait();
				}
			}
			
			catch(InterruptedException ex)
			{
				ex.printStackTrace();
			}	
			
			// Output the event information produced by Producer thread
			while(true)
			{
				for(int count = 0; count < vectorQueue.size(); count++)
				{
					System.out.println(vectorQueue.elementAt(count));
				}		
			}
		}
	}
	
	
	/************************* Inner class for queue **************************/
	class Queue
	{
		public String getEventInfo()
		{
			return eventInfo;
		}
		
		public synchronized void storeEventInfo(String event)
		{
			eventInfo = event;
			
			// Add new event to the queue
			vectorQueue.addElement(eventInfo);
			
			// Notify other threads
			notifyAll();
		}
	}
}
Please help :(

Message was edited by:
inko9nito

Message was edited by:
inko9nito
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Nov 10 2006
Added on Oct 12 2006
2 comments
268 views