2

我的问题是说我的方法getAllVendorDetails()将调用另一个方法getVendordetailsById(int id),如果该方法getVendordetailsById()在指定时间(如 30 秒)内没有返回响应/答案,我需要移动到下一个供应商或跳过执行并向用户显示错误消息。我们如何在 Java 中实现这个结果。我尝试了下面的代码,但它不起作用。在它进入 之后getVendordetailsById(),它没有返回。

公共类测试{

public static void main(String[] args) {
    long currentTime=System.currentTimeMillis();
    Date date=new Date(currentTime);
    date.setSeconds(date.getSeconds()+30);
    long end=date.getTime();
    System.out.println("Time="+(end-currentTime));

    List<Integer> vendorId= new ArrayList<Integer>();
    for (int i = 1; i <= 100000; i++) {
        vendorId.add(i);
    }
    boolean isSuccess=false;
    boolean flag=true;

    while(end>System.currentTimeMillis()){

        if(flag){
            flag=false;
            for (int i = 0; i < vendorId.size() && end>System.currentTimeMillis() ; i++) {
                getVendordetailsById(vendorId.get(i));
                isSuccess=true;
            }
        }
        System.out.println("bye");
    }

    if(isSuccess){
        System.out.println("Success");
    }else{
        System.out.println("Errorr");
    }



    System.out.println("Current time="+System.currentTimeMillis());
}

private static void getVendordetailsById(Integer id) {
    System.out.println("vendor number="+id);
    int a=0;
    for (int i = 1; i <= 1000; i++) {
        a=a+i;
    }

    System.out.println("Current value of a="+a);
}

}

4

1 回答 1

0

您可以使用 java.util.concurrent.Future 来解决您的问题。

首先,您需要使用 java.util.concurrent.Executors 创建一个执行器来提交您未来的工作

   //suggest that use it out of the loop
   //or in the static field
   java.util.concurrent.ExecutorService es = java.util.concurrent.Executors.newFixedThreadPool(1);
   //...in the loop
   Future<Object> future = es.submit(new Callable<Object>{
       public Object call(){
           getVendordetailsById 
       }
   });
   try{
      Object result = future.get(30, TimeUnit.SECONDS);
   }cache(TimeoutException te){
     break;
   }cache(Exception te){
      //other exception handler
   }
于 2013-03-28T12:36:35.733 回答