Java 即使存在循环,主线程也会死机
在主线程中,用户可以在选择获取订单的选项后从控制台发出订单。选择该选项后,我将触发一个线程chef.start();负责将客户从队列中取出并准备订单。一旦顺序准备好,我就有了从线程调用的监听器,监听器只显示消息 问题是,即使我的代码是循环的,我的主线程也会死机。我无法提供进一步的输入以请求另一个订单Java 即使存在循环,主线程也会死机,java,multithreading,Java,Multithreading,在主线程中,用户可以在选择获取订单的选项后从控制台发出订单。选择该选项后,我将触发一个线程chef.start();负责将客户从队列中取出并准备订单。一旦顺序准备好,我就有了从线程调用的监听器,监听器只显示消息 问题是,即使我的代码是循环的,我的主线程也会死机。我无法提供进一步的输入以请求另一个订单 public class Driver { private static LinkedBlockingQueue<Customer> waitingCustomer=new Li
public class Driver {
private static LinkedBlockingQueue<Customer> waitingCustomer=new LinkedBlockingQueue<Customer>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
OrderPrepared op=new OrderPrepared(waitingCustomer);
while (true) {
System.out.println("would you like to place new Order Press Y or N");
String input = sc.nextLine();
if ("y".equalsIgnoreCase(input)) {
Customer customer = null;
System.out.println("Enter Customer Name");
String name = sc.nextLine();
System.out.println("What would you like to order");
System.out.println(" ");
System.out.println("Our Menu Card ");
System.out.println(" ");
System.out.println("Item Name\t\t" + " Price\t\t" + "Press to order");
System.out.println(" ");
System.out.println("Cheese And Tomato\t\t" + "60\t\t" + "1");
System.out.println("Margerita \t\t" + "40\t\t" + "2");
System.out.println("Burger \t\t" + "50\t\t" + "3");
System.out.println("Chicken Fried \t\t" + "90\t\t" + "4");
System.out.println(" ");
System.out.println("Please Press Number to place order");
int number=sc.nextInt();
Food food=null;
switch(number) {
case 1:
food=new Food("Cheese And Tomato", 60.0d);
case 2:
food=new Food("Margerita", 40.0d);
case 3:
food=new Food("Burger", 50.0d);
case 4:
food=new Food("Chicken Fried", 90.0d);
}
Random ran=new Random(709);
customer=new Customer(name,new Order(ran.nextInt(), food));
waitingCustomer.add(customer);
Chef chef=new Chef();
chef.setChefListener(op);
chef.setCustomers(waitingCustomer);
chef.setFood(food);
chef.start();
} else {
break;
}
}
}
}
public class Chef extends Thread {
Food food;
ChefListener chefListener;
LinkedBlockingQueue<Customer> customers;
public Chef() {
}
public Chef(Food piza, ChefListener chefListener, LinkedBlockingQueue<Customer> customers) {
super();
this.food = piza;
this.chefListener = chefListener;
this.customers = customers;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (Customer customer : customers) {
chefListener.pizzaCooked(customer, food);
customers.remove();
System.out.println("customer has been removed from queue");
}
}
public Food getFood() {
return food;
}
public void setFood(Food food) {
this.food = food;
}
public ChefListener getChefListener() {
return chefListener;
}
public void setChefListener(ChefListener chefListener) {
this.chefListener = chefListener;
}
public LinkedBlockingQueue<Customer> getCustomers() {
return customers;
}
public void setCustomers(LinkedBlockingQueue<Customer> customers) {
this.customers = customers;
}
}
public class OrderPrepared implements ChefListener{
Logger logger=Logger.getLogger("OrderPrepared");
public OrderPrepared(LinkedBlockingQueue<Customer> waitingCustomer) {
}
@Override
public void pizzaCooked(Customer customer, Food food) {
// TODO Auto-generated method stub
logger.info(customer.getName()+" "+food.getName() + " has been cooked. Enjoy");
}
}
Output
import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Logger;
public class OrderPrepared implements ChefListener{
Logger logger=Logger.getLogger("OrderPrepared");
public OrderPrepared(LinkedBlockingQueue<Customer> waitingCustomer) {
// TODO Auto-generated constructor stub
}
@Override
public void pizzaCooked(Customer customer, Food food) {
// TODO Auto-generated method stub
logger.info(customer.getName()+" "+food.getName() + " has been cooked. Enjoy");
}
}
Output
would you like to place new Order Press Y or N
Y
Enter Customer Name
Kalis
What would you like to order
Our Menu Card
Item Name Price Press to order
Cheese And Tomato 60 1
Margerita 40 2
Burger 50 3
Chicken Fried 90 4
Please Press Number to place order
2
would you like to place new Order Press Y or N
customer has been removed from queue
Nov 12, 2019 2:32:45 AM OrderPrepared pizzaCooked
INFO: Kalis Chicken Fried has been cooked. Enjoy
公共类驱动程序{
私有静态LinkedBlockingQueue waitingCustomer=新LinkedBlockingQueue();
公共静态void main(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
OrderPrepared op=已准备好的新订单(waitingCustomer);
while(true){
System.out.println(“您想下新订单,按Y还是按N”);
字符串输入=sc.nextLine();
如果(“y”。相等信号情况(输入)){
客户=空;
System.out.println(“输入客户名称”);
字符串名称=sc.nextLine();
System.out.println(“您想要点什么”);
System.out.println(“”);
System.out.println(“我们的菜单卡”);
System.out.println(“”);
System.out.println(“项目名称\t\t“+”价格\t\t“+”按订单”);
System.out.println(“”);
System.out.println(“奶酪和番茄”+“60\t\t”+“1”);
System.out.println(“Margerita\t\t”+“40\t\t”+“2”);
System.out.println(“Burger\t\t”+“50\t\t”+“3”);
System.out.println(“炸鸡”+“90\t\t”+“4”);
System.out.println(“”);
System.out.println(“请按数字下单”);
int number=sc.nextInt();
食物=零;
开关(编号){
案例1:
食品=新食品(“奶酪和番茄”,60.0d);
案例2:
食品=新食品(“玛格丽塔”,40.0d);
案例3:
食品=新食品(“汉堡”,50.0d);
案例4:
食品=新食品(“炸鸡”,90.0d);
}
随机运行=新随机(709);
客户=新客户(名称,新订单(ran.nextInt(),food));
waitingCustomer.add(客户);
厨师长=新厨师();
厨师长塞切弗利斯滕纳(op);
厨师长:设置顾客(等待顾客);
厨师长.食物(食物);
chef.start();
}否则{
打破
}
}
}
}
公共类扩展线程{
食品;
ChefListener ChefListener;
LinkedBlockingQueue客户;
主厨(){
}
公共厨师(食品皮萨、切弗利斯滕、LinkedBlockingQueue客户){
超级();
这个食物=比萨;
this.chefListener=chefListener;
这是。顾客=顾客;
}
@凌驾
公开募捐{
//TODO自动生成的方法存根
用于(客户:客户){
chefListener.比萨饼熟(顾客、食物);
客户。删除();
System.out.println(“客户已从队列中删除”);
}
}
公共食品{
归还食物;
}
公共食品(食品){
这就是食物;
}
公共ChefListener getChefListener(){
返回chefListener;
}
公共无效设置ChefListener(ChefListener ChefListener){
this.chefListener=chefListener;
}
公共LinkedBlockingQueue getCustomers(){
返回客户;
}
公共无效集合客户(LinkedBlockingQueue客户){
这是。顾客=顾客;
}
}
公共类OrderPrepared实现了ChefListener{
Logger=Logger.getLogger(“OrderPrepared”);
已准备好公共订单(LinkedBlockingQueue waitingCustomer){
}
@凌驾
已煮熟的公共空比萨饼(顾客、食物){
//TODO自动生成的方法存根
logger.info(customer.getName()+“”+food.getName()+“已经煮熟了。享受”);
}
}
输出
导入java.util.concurrent.LinkedBlockingQueue;
导入java.util.logging.Logger;
公共类OrderPrepared实现了ChefListener{
Logger=Logger.getLogger(“OrderPrepared”);
已准备好公共订单(LinkedBlockingQueue waitingCustomer){
//TODO自动生成的构造函数存根
}
@凌驾
已煮熟的公共空比萨饼(顾客、食物){
//TODO自动生成的方法存根
logger.info(customer.getName()+“”+food.getName()+“已经煮熟了。享受”);
}
}
输出
您想按Y或N下新订单吗
Y
输入客户名称
卡利斯
您想要点什么
我们的菜单卡
商品名称价格按订单
奶酪和番茄60 1
玛格丽塔40 2
汉堡503
炸鸡904
请按号码下单
2.
您想按Y或N下新订单吗
客户已从队列中删除
2019年11月12日凌晨2:32:45准备好的比萨饼
信息:卡利斯炸鸡已经做好了。享受
nextInt()不使用LF。使用nextLine()跟随nextInt(),以便使用行终止符(lf)。否则,循环顶部的下一行将以空行退出
也看到