This question already has an answer here:
I have a Waiter class, which takes order and adds it to orders list in ordermanager class. In turn the ordermanager class adds the order in chef class, which has a cook method inside it. Once the order is cooked, the order is removed from the order list inside chef as well as ordermanager class. The waiter and chef run on two different threads, I am getting java,util.ConcurrentModification exception if I try to add order before the previous order is finished. How can I solve this problem? Classes as follow:
Waiter class:
public class Waiter implements Runnable {
//private Order order;
@Override
public void run() {
this.getOrder();
}
private void finishOrder(List<Item> items){
System.out.println("inside finish order");
Order order = new Order(items);
OrderManager.getInstance().takeOrder(order);
}
private void getOrder() {
int itemId = 0;
int order = 1;
Item item = null;
List<Item> items = new ArrayList<Item>();
while (order != 0) {
message("press 1 for sandwich,2 for coffee,3 for cereal, 4 for pizza,5 to finish order");
itemId = getItemId();
switch (itemId) {
case 1:
item = new Sandwich();
items.add(item);
break;
case 2:
item = new Coffee();
items.add(item);
break;
case 3:
item = new Cereal();
items.add(item);
break;
case 4:
item = new Pizza();
items.add(item);
break;
case 5:
finishOrder(items);
message("order placed.");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
}
}
public void message(String string) {
System.out.println(string);
}
private int getItemId() {
message("Enter item id:");
int itemId = 0;
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
String stringItemId = reader.readLine();
itemId = Integer.parseInt(stringItemId);
if (itemId > 5) {
message("Item Id not present");
} else if (itemId <= 0) {
message("Item Id not present");
}
} catch (NumberFormatException e) {
message("not a valid item id");
getItemId();
} catch (IOException e) {
message("not a valid item id");
}
return itemId;
}
}
Chef class:
public class Chef implements Observer,Runnable{
private Boolean isAvailable;
private List<Order> orders;
public Chef(){
this.isAvailable = true;
//this.order = null;
orders = new ArrayList<Order>();
}
public List<Order> getOrders(){
return this.orders;
}
public void addToOrders(Order order){
System.out.println("order size-->"+orders.size());
this.orders.add(order);
}
public boolean getIsAvailable(){
return this.isAvailable;
}
public void setIsAvailable(boolean isAvailable){
this.isAvailable = isAvailable;
}
public void cook(Order order) throws IOException {
System.out.println("Picked up" + order.getOrderNumber() + "at"
+ getFormattedTime());
for (Item item : order.getItems()) {
System.out.println("cooking" + item.getName());
try {
this.writeToFile();
Thread.sleep(item.getPreparationTime() * 60 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Finished making" + item.getName() + "at"
+ getFormattedTime());
this.orders.remove(0);
OrderManager.getInstance().removeOrder(order);
}
}
public void run() {
Boolean run = true;
while (run) {
System.out.println("chef thread running");
System.out.println("orders size" + this.getOrders().size());
if(!this.getOrders().isEmpty()){
System.out.println("Start cooking");
try {
this.cook(this.getOrders().get(0));
// this.orderCompleted(this.getOrders().get(0));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void orderCompleted(Order order){
this.orders.remove(order);
this.isAvailable = true;
}
private String getFormattedTime() {
Calendar now = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("h:mm:ss a");
String formattedDate = sdf.format(now.getTime());
return formattedDate;
}
private void writeToFile() throws IOException{
String content = "This is the content to write into file";
File file = new File("/home/kumuda/Desktop/filename.txt");
// if file doesnt exists, then create it
if (!file.exists()) {
file.createNewFile();
}
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(content);
bw.close();
}
}
OrderManager class:
public class OrderManager {
public static List<Order> orderList = new ArrayList<Order>();
private static List<Chef> chefs = new ArrayList<Chef>();
private static OrderManager orderManager;
private OrderManager(){
}
public static OrderManager getInstance(){
if(orderManager == null){
orderManager = new OrderManager();
}
return orderManager;
}
public void takeOrder(Order order){
System.out.println("inside take order");
orderList.add(order);
this.assignOrderToChef(order);
}
public List<Order> getOrders() {
return orderList;
}
public void addOrder(Order order){
System.out.println("Inside add order");
}
public void removeOrder(Order order){
orderList.remove(order);
}
public void assignOrderToChef(Order order){
System.out.println("inside assign ordeer to chef");
for(Chef chef : chefs){
if(chef.getIsAvailable()){
chef.addToOrders(order);
break;
}
}
}
public void addChef(Chef chef){
chefs.add(chef);
}
}
Main class:
public class LeanStartUpBar {
public static void main(String[] args){
Waiter waiter = new Waiter();
Chef chef = new Chef();
OrderManager.getInstance().addChef(chef);
Thread waiterThread = new Thread(waiter);
Thread chefThread = new Thread(chef);
waiterThread.start();
chefThread.start();
}
}
Aucun commentaire:
Enregistrer un commentaire