the problem is that you do synchronization on stack instance in your recievers, so no matter how many you have only one would process at time. So no need to have more than one reciever than :)
First, you should probably change your algorithm to get rid of synchronization in place.
I'd just google for producer with multiple consumers in java and get some inspiration depending on your preferences.
UPDATE:
You just say in your consumer:
Consumer implements Runnable{
public void run() {
while (true){
synchronized(sharedStack){
that means, only the 1.st consumer comming to the statement synchronized(sharedStack){
will be able to get in, others will wait till the one leaves the bloc }
.
So that means you process only by one consumer in time. Others wait and the 1.st lucky one will process next iteration (in your case was it the same one who processed the iteration before).
See the official docs for more info on synchronized blocks.