java 方法 执行超时处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 方法 执行超时处理相关的知识,希望对你有一定的参考价值。

在java中如何监控一个java方法执行是否超时,该java方法的执行时间大约为20s,返回值为boolean类型,如果在20s内执行完则继续执行其他任务,如果执行时间超过20s,即中断当前执行的该方法,并向日志文件中写入如下内容“当前时间:xxx执行超时,请检查”,在网上看了好多资料,都写得云里雾里的。悬赏50分啊。

  java 1.5以上的Future类可以执行超时处理。

  jdk1.5自带的并发库中Future类中重要方法包括get()和cancel(),get()获取数据对象,如果数据没有加载,就会阻塞直到取到数据,而 cancel()是取消数据加载。另外一个get(timeout)操作,表示如果在timeout时间内没有取到就失败返回,而不再阻塞。

  代码如下:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;


import com.sun.corba.se.impl.orbutil.closure.Future;
import com.sun.corba.se.impl.orbutil.threadpool.TimeoutException;
public class ThreadTest   
  
    public static void main(String[] args) throws InterruptedException,  
            ExecutionException   
          
        final ExecutorService exec = Executors.newFixedThreadPool(1);  
          
        Callable<String> call = new Callable<String>()   
            public String call() throws Exception   
                //开始执行耗时操作  
                Thread.sleep(1000 * 5);  
                return "线程执行完成.";  
              
        ;  
          
        try   
            Future<String> future = exec.submit(call);  
            String obj = future.get(1000 * 1, TimeUnit.MILLISECONDS); //任务处理超时时间设为 1 秒  
            System.out.println("任务成功返回:" + obj);  
         catch (TimeoutException ex)   
            System.out.println("处理超时啦....");  
            ex.printStackTrace();  
         catch (Exception e)   
            System.out.println("处理失败.");  
            e.printStackTrace();  
          
        // 关闭线程池  
        exec.shutdown();  
      
参考技术A 写一个监听线程就ok啦,执行方法前启动一个线程,20s后去看那个方法有没有结束(可以搞个标记用于判断) 参考技术B 这个问题没有太好的安全解决办法。
你可以把方法封装在线程里,
然后外部用一个定时线程延时20S苏醒看看那个工作线程执行结束了没有,
如果没有,那么就设置工作线程的结束标志,等待工作线程结束。
在工作线程内部加上判断结束标志的代码,一旦为真马上退出本函数。
参考技术C 可以在方法里面加定时器, 从进方法开始。
schedule(TimerTask task, long delay, long period)
TimerTask :定时任务,可以在里面写一个中断或者返回。
具体逻辑:
mytask
设置定时任务(myTimerTask),20s即20000ms后执行“中断”;
这里是要执行的该任务的内容;
执行任务完成后取消定时任务并正常返回;


myTimerTask
执行中断操作;
写入错误日志;
追问

哥,你讲的也太粗了吧。。。。给点详细思路。我对这个定时器不太熟悉哎。

追答

定时器类Timer在java.util包中。使用时,先实例化,然后使用实例的schedule(TimerTask task, long delay)方法,设定指定的任务task在指定的延迟delay后执行。定时器任务类TimerTask是抽象类,继承并重写其run()方法,可实现具体任务。

你可以查一下API。

追问

是这样的我的整个系统已经设置了定时器,就是当系统启动的时候定时器就启动,系统的主体任务10min执行一次,任务主要是用循环的方式从其它平台获取数据的,但是如果有一个平台的系统因为性能原因卡死的话我这个系统就会卡在那边没反应,我是想设置一个超时检查,当循环获取数据的时候有一个卡死就提示出错,不太可能使用嵌套的定时器去控制数据的获取,不知道你是否知道如何使用 响应超时这方面的方法。

追答

加一个拦截器,拦截你想监控的操作, 拦截器里面写定时器, 不过这样的话会牺牲很多效率

本回答被提问者和网友采纳
参考技术D 搞个线程试试

怎么做java超时处理方法

调用如下方法
怎么做超时停止运行

public void test(int timeOut)
int i = 1;
while (true)
if (i == 0)
break;


import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

 class Test26 
        public static void main(String[] args) 
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.println("开始:"+sdf.format(new Date()));
            Future<String> future = new FutureTask<String>(new Callable<String>() 
                public String call() throws Exception 
                    test();
                    return null;
                
            );
            
            try 
                future.get(10, TimeUnit.SECONDS);//执行10秒结束
             catch (Exception e) 
             
            System.out.println("结束:"+sdf.format(new Date()));
        
        
        public static void test() 
            int i = 1;
            while (true) 
                if (i == 0) 
                    break;
                
            
        
参考技术A 你说的停止运行?是什么停止?追问

如用下面的主方法运行,我想10秒钟后结束运行。
public static void main(String[] args)
System.out.println("开始");
test(10);
System.out.println("结束");

追答

搞错了,,要定时是吧。我写下。

import java.util.Timer;
import java.util.TimerTask;

public class TimeTaskTest 

public static void main(String[] args) 
Timer timer = new Timer();
//10秒后调用run方法
timer.schedule(new Task(), 10 * 1000);



class Task extends TimerTask 
public void run() 
//结束程序
System.exit(0);

追问

不是定时,是一个方法中可能出现死循环,我想用到超时,跳出死循环。

不能用如下方法,想做成一个公用的超时方法
public void test(int timeOut)
int i = 1;
int time=1;
while (true)
if (i == 0)
break;

Thread.sleep(1000);
time++;
if(time>timeOut)
break;


追答

你写的这个有问题吗?

以上是关于java 方法 执行超时处理的主要内容,如果未能解决你的问题,请参考以下文章

怎么做java超时处理方法

接口超时需要怎么处理

Java如何实现任务超时处理

java题目运行超时是怎么回事

java方法执行超时关闭

java在超时值后杀死线程[重复]