永发信息网

java 方法 执行超时处理

答案:5  悬赏:70  手机版
解决时间 2021-02-19 08:07
java 方法 执行超时处理
最佳答案
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 call = new Callable() {  
            public String call() throws Exception {  
                //开始执行耗时操作  
                Thread.sleep(1000 * 5);  
                return "线程执行完成.";  
            }  
        };  
          
        try {  
            Future 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();  
    }  
}
全部回答
这个问题没有太好的安全解决办法。
你可以把方法封装在线程里,
然后外部用一个定时线程延时20S苏醒看看那个工作线程执行结束了没有,
如果没有,那么就设置工作线程的结束标志,等待工作线程结束。
在工作线程内部加上判断结束标志的代码,一旦为真马上退出本函数。
搞个线程试试
写一个监听线程就ok啦,执行方法前启动一个线程,20s后去看那个方法有没有结束(可以搞个标记用于判断)
可以在方法里面加定时器, 从进方法开始。
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执行一次,任务主要是用循环的方式从其它平台获取数据的,但是如果有一个平台的系统因为性能原因卡死的话我这个系统就会卡在那边没反应,我是想设置一个超时检查,当循环获取数据的时候有一个卡死就提示出错,不太可能使用嵌套的定时器去控制数据的获取,不知道你是否知道如何使用 响应超时这方面的方法。追答加一个拦截器,拦截你想监控的操作, 拦截器里面写定时器, 不过这样的话会牺牲很多效率
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
我要买一只小的藏獒在哪里有卖的
花仙子庆典在什么地方啊,我要过去处理事情
求助。从深圳龙华到浙江台州黄岩西客站有车吗
1.black+white=( ) 3.red+yellow=( ) 2.green
东元酒店地址在什么地方,想过去办事
跪求惠普笔记本电脑win7旗舰系统的宽带连接错
奥黛丽赫本My Fair Lady,求百度云分享,谢谢
带有振和锦字的四字词,或者含有振 锦 静这三
冷水树地址在什么地方,想过去办事
骂女人用什么语言最有杀伤力?
如果一个三角形三边长度的平方比为 2 3 5 这
下列关于实验基本操作的说法中,错误的是DA.
梦幻西游修炼坐骑用什么划算
章鹏时裳地址有知道的么?有点事想过去
有一款单机游戏是破除阻碍逃出森林的游戏叫什
推荐资讯
计划生育服务站小良镇所在哪里啊,我有事要去
德胜门内大街/西海东沿(路口)在什么地方啊,
分手还是不分手?
银会变黄吗
要建一个面积为130m2的长方形养鸡场,为了节
男生嘴巴小
卡卡西地址在哪,我要去那里办事
个体对认知对象的某些品质一旦形成倾向性印象
本市普通信件邮寄需贴多少价的邮票?
咖啡师到国外有前途吗?
慢性化脓性上颌窦炎的最主要的确诊依据是A.中
柜子刷漆是用什么板材跟用清漆还是混漆,求知
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?