BAEL-7430 first draft (#15728)

* BAEL-7430 first draft

* Revised the code

---------

Co-authored-by: Wynn Teo <wynnteo@Wynns-MacBook-Pro.local>
This commit is contained in:
Wynn Teo 2024-02-01 10:55:12 +08:00 committed by GitHub
parent b490028e69
commit fd59ccd374
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 75 additions and 0 deletions

View File

@ -0,0 +1,33 @@
package com.baeldung.countdownlatchvssemaphore;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
// Create a CountDownLatch with an initial count equal to the number of tasks to be completed
int numberOfTasks = 3;
CountDownLatch latch = new CountDownLatch(numberOfTasks);
// Simulate completion of tasks by worker threads
for (int i = 1; i <= numberOfTasks; i++) {
new Thread(() -> {
System.out.println("Task completed by Thread " + Thread.currentThread()
.getId());
// Decrement the latch count to signal completion of a task
latch.countDown();
}).start();
}
// Main thread waits until all tasks are completed
latch.await();
System.out.println("All tasks completed. Main thread proceeds.");
// Attempting to reset will have no effect
latch.countDown();
// Latch is already at zero, await() returns immediately
latch.await(); // This line won't block
System.out.println("Latch is already at zero and cannot be reset.");
}
}

View File

@ -0,0 +1,42 @@
package com.baeldung.countdownlatchvssemaphore;
import java.util.concurrent.Semaphore;
public class SemaphoreDemo {
public static void main(String[] args) {
// Create a Semaphore with a fixed number of permits
int NUM_PERMITS = 3;
Semaphore semaphore = new Semaphore(NUM_PERMITS);
// Simulate resource access by worker threads
for (int i = 1; i <= 5; i++) {
new Thread(() -> {
try {
// Acquire a permit to access the resource
semaphore.acquire();
System.out.println("Thread " + Thread.currentThread().getId() + " accessing resource.");
// Simulate resource usage
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// Release the permit after resource access is complete
semaphore.release();
}
}).start();
}
// Simulate resetting the Semaphore by releasing additional permits after a delay
try {
Thread.sleep(5000);
// Resetting the semaphore permits to the initial count
semaphore.release(NUM_PERMITS);
System.out.println("Semaphore permits reset to initial count.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}