Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Semaphore Stop Threads

Good afternoon all,

I'm working with Java's semaphore and concurrency for a school project and had a few questions regarding how it works!

If there are no permits available, I need the thread to exit the "queue" - not just sleep until one is ready. Is this possible? As you can see in my try, catch, finally - there is no handle for this event:

try {
    semaphore.acquire();
    System.out.println(Thread.currentThread().getName() + " aquired for 3 seconds " + semaphore.toString());
    Thread.sleep(3000);
}
catch (InterruptedException e) {
   e.printStackTrace();
} finally {   
   semaphore.release();
   System.out.println(Thread.currentThread().getName() + " released " + semaphore.toString());
}

Daniel brought up the tryAquire function - this looks great but the tutorials I have read state that semaphores require a try, catch, finally block to prevent a deadlock. My current code (implementing tryAquire) will release in the finally block even if that thread was never acquired. Do you have any suggestions?

public void seatCustomer(int numBurritos) {
    try {
        if(semaphore.tryAcquire()) {
            System.out.println(Thread.currentThread().getName() + " aquired for 3 seconds " + semaphore.toString());
            Thread.sleep(3000); 
        } else {
            System.out.println(Thread.currentThread().getName() + " left due to full shop");
        }

    }
    catch (InterruptedException e) {
       e.printStackTrace();
    } finally {   
       semaphore.release();
       System.out.println(Thread.currentThread().getName() + " released " + semaphore.toString());
    }
}
like image 631
Nathan_Sharktek Avatar asked Dec 29 '25 22:12

Nathan_Sharktek


1 Answers

I suggest you read the JavaDocs for Semaphor. In particular, look at the tryAcquire method.

Acquires a permit from this semaphore, only if one is available at the time of invocation.

Acquires a permit, if one is available and returns immediately, with the value true, reducing the number of available permits by one.

If no permit is available then this method will return immediately with the value false.

What this means is you can try to acquire a permit if any are available. If none are available, this method returns false immediately instead of blocking.

You'll have to make your "finally" block a little smarter.

boolean hasPermit = false;
try {
    hasPermit = semaphore.tryAcquire();
    if (hasPermit) {
        // do stuff.
    }
} finally {
    if (hasPermit) {
       semaphore.release();
    }
}
like image 143
Daniel Avatar answered Jan 01 '26 12:01

Daniel