如何在一段时间后终止方法

时间:2021-04-03 11:18:38

标签: java time terminate

我正在尝试做一个订票系统。 客户可以选择的方法之一是 makeOrder()。在这种方法中,他选择了票数,然后我想给他 10 分钟的时间来选择座位。如果他选择了它们并确认了订单,则该方法应该结束,他可以再次从 MainMenu 中选择选项。如果他在 10 分钟内没有选择座位,我想删除订单,通知他并向他展示 MainMenu。我不知道该怎么做。任何人都可以帮助我吗?

pseudocode

public class MainMenu{

public void handle(String option) {  
   switch (option) {
      case "1":   showScreenings(); break;
      case "2":   makeOrder(); break;
      default:    System.out.println("Unknown option"); break;
   }
}

private void makeOrder(){
   // customer selects number of tickets and then order is created
   Order order = new Order()
   
   // here I want to give a customer 10 minutes to select seats so I tried it with Timer
   // but it deletes the order but still waiting for the input of the customer
   Timer t = new java.util.Timer();
    t.schedule( new java.util.TimerTask() {
        @Override
        public void run() {
            if (order.getOrderedDateTime() == null){
                try {
                    order.delete();
                    System.out.println("Time out");

                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            t.cancel();
        }
    }, TimeUnit.MINUTES.toMillis(10));

     //code to select seats
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
     String seats = br.readline()  // if he doesnt select seats in 10 minutes I want to delete order
     
     //reserve seats and confirm order
     order.confirm();
}
}

2 个答案:

答案 0 :(得分:0)

我认为“但仍在等待客户的输入”的意思是您需要某种 UI 反馈,因此您可以通过多种方式处理此问题,一种方法是您可以显示一个对话框,通知用户取消订单,并使用以下方法刷新活动(如果可能):

finish();
startActivity(getIntent());

答案 1 :(得分:0)

据我所知,您希望等待 10 分钟以等待用户操作。如果他/她在 10 分钟内采取行动,那么您将继续确认订单。

如果用户在 10 分钟内未采取行动,您要删除订单。

您可以尝试在特定时间等待线程完成的 Future。

System.out.println("Wait 10 seconds to get user input");
        
        StringBuilder stringBuilder = new StringBuilder();
        ExecutorService executor = Executors.newSingleThreadExecutor();
        
        Future<?> future = executor.submit(()->{
            //code to select seats
            System.out.println("Enter Seat No: ");
             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
             try {
                 stringBuilder.append(br.readLine()); 
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        
        try {
            future.get(10, TimeUnit.SECONDS);
            System.out.println("Seat selected. Let's confirm the order");
        } catch (TimeoutException | ExecutionException e) {
            future.cancel(true);
            System.out.println("Time out Delete oder");
            // delete order
        }  finally {
            executor.shutdownNow();
        }
相关问题