Source Code : Use ReentrantLock to coordinate
Java Is Open Source Programming Language You Can Download From Java and Java Libraries From http://www.oracle.com.
Click Here to download
We provide this code related to title for you to solve your developing problem easily. Libraries which is import in this program you can download from http://www.oracle.com.
Click Here or search from google with Libraries Name you get jar file related it
Use ReentrantLock to coordinate
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test {
Set<Thread> orderingThreads = new HashSet<Thread>();
Lock lock = new ReentrantLock();
final Map<String, Integer> inventoryMap = new LinkedHashMap<String, Integer>();
List<Task> customerOrders = new ArrayList<Task>();
public static void main(String[] args) throws InterruptedException {
Test t = new Test();
t.start();
}
private void start() throws InterruptedException {
for (int i = 0; i < 10; i++) {
inventoryMap.put("Book #" + i, 100);
}
for (int i = 0; i < 20; i++) {
createOrderingThread();
}
checkInventoryLevels();
for (Thread thread : orderingThreads) {
thread.interrupt();
}
displayOrders();
}
private void displayOrders() {
try {
lock.lock();
for (Task order : customerOrders) {
System.out.println(order.getCount() + " "
+ order.id() + " for " + order.getTaskName());
}
} finally {
lock.unlock();
}
}
private void createOrderingThread() {
Thread orderingThread = new Thread(new Runnable() {
public void run() {
while (!Thread.interrupted()) {
createRandomOrder();
}
}
});
orderingThread.start();
orderingThreads.add(orderingThread);
}
private void createRandomOrder() {
String itemOrdered = UUID.randomUUID().toString();
String customerName = "Customer ";
fulfillOrder(itemOrdered, 2, customerName);
}
private boolean fulfillOrder(String itemOrdered, int quantityOrdered,
String customerName) {
try {
lock.lock();
int currentInventory = inventoryMap.get(itemOrdered);
if (currentInventory < quantityOrdered) {
return false;
}
inventoryMap.put(itemOrdered, currentInventory - quantityOrdered);
Task order = new Task(itemOrdered, quantityOrdered,
customerName);
customerOrders.add(order);
return true;
} finally {
lock.unlock();
}
}
private void checkInventoryLevels() {
try {
lock.lock();
for (Map.Entry<String, Integer> inventoryEntry : inventoryMap.entrySet()) {
System.out.println(inventoryEntry.getKey() + " "
+ inventoryEntry.getValue());
}
} finally {
lock.unlock();
}
}
}
class Task {
String id;
int count;
String taskName;
Task(String id, int q, String c) {
this.id = id;
this.count = q;
this.taskName = c;
}
public String id() {
return id;
}
public int getCount() {
return count;
}
public String getTaskName() {
return taskName;
}
}
Thank with us