java 方法 执行超时处理

在java中如何监控一个java方法执行是否超时,该java方法的执行时间大约为20s,返回值为boolean类型,如果在20s内执行完则继续执行其他任务,如果执行时间超... 在java中如何监控一个java方法执行是否超时,该java方法的执行时间大约为20s,返回值为boolean类型,如果在20s内执行完则继续执行其他任务,如果执行时间超过20s,即中断当前执行的该方法,并向日志文件中写入如下内容“当前时间:xxx执行超时,请检查”,在网上看了好多资料,都写得云里雾里的。悬赏50分啊。 展开
 我来答
杜爷1号
2015-07-14 · 知道合伙人软件行家
杜爷1号
知道合伙人软件行家
采纳数:4973 获赞数:9186
毕业于福建农林大学,本科学士学位。从事IT行业3年,曾参与过多个大型项目的需求调研、软件研发。

向TA提问 私信TA
展开全部

  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();  
    }  
}
ljwhx2002
2013-03-23 · 超过18用户采纳过TA的回答
知道答主
回答量:45
采纳率:0%
帮助的人:42.2万
展开全部
写一个监听线程就ok啦,执行方法前启动一个线程,20s后去看那个方法有没有结束(可以搞个标记用于判断)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
极天异云
2013-03-19 · TA获得超过1054个赞
知道小有建树答主
回答量:1170
采纳率:42%
帮助的人:398万
展开全部
这个问题没有太好的安全解决办法。
你可以把方法封装在线程里,
然后外部用一个定时线程延时20S苏醒看看那个工作线程执行结束了没有,
如果没有,那么就设置工作线程的结束标志,等待工作线程结束。
在工作线程内部加上判断结束标志的代码,一旦为真马上退出本函数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cwy121
2013-03-19 · TA获得超过108个赞
知道答主
回答量:115
采纳率:0%
帮助的人:65.1万
展开全部
可以在方法里面加定时器, 从进方法开始。
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。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
爱似似流年
2013-03-19 · 超过12用户采纳过TA的回答
知道答主
回答量:102
采纳率:0%
帮助的人:39.3万
展开全部
搞个线程试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式