public class SemaphoreGroup
{
	int[]	values;
	
	public SemaphoreGroup(int noElements)
	{
		values = new int[noElements];
	} //constructor
	
	public synchronized void changeValues(int[] deltas)
	{
		while (!canChange(deltas))
		{
			try
			{
				wait();
			} //try
			catch (InterruptedException ie)
			{
				System.out.println("An InterruptedException caught\n"+ie.getMessage());
				ie.printStackTrace();
				System.exit(1);
			} //catch()
		} //while
		doChange(deltas);
		notifyAll();
	} //changeValues()
	
	private boolean canChange(int[] deltas)
	{
		for(int i=0; i<values.length; i++)
		{
			if(values[i] + deltas[i] < 0)
				return false;
		} //for
		return true;
	} //canChange()
	
	private void doChange(int[] deltas)
	{
		for (int i=0; i<values.length; i++)
		{
			values[i] += deltas[i];
		} //for
	} //doChange()
	
	public int getNumberOfMembers()
	{
		return values.length;
	} //getNumberOfMembers()
} //class SemaphoreGroup	