想在java程序中判断某个方法执行是否超时,比如说,如果该方法执行时间超过两秒,那么将结束本次程序执行
public class TimeoutException extends RuntimeException {
/**
* 序列化号
*/
private static final long serialVersionUID = -8078853655388692688L;public TimeoutException(String errMessage)
{
super(errMessage);
System.out.println("2");
}
}public class TimeoutThread extends Thread{
/**
* 计时器超时时间
*/
private long timeout;
  
/**
* 计时是否被取消
*/
private boolean isCanceled = false;
  
/**
* 当计时器超时时抛出的异常
*/
private TimeoutException timeoutException;
  
/**
* 构造器
* @param timeout 指定超时的时间
*/
public TimeoutThread(long timeout,TimeoutException timeoutErr) {
super();
this.timeout = timeout;
this.timeoutException = timeoutErr;
//设置本线程为守护线程
this.setDaemon(true);
}
  
/**
* 取消计时
*/
public synchronized void cancel()
{
isCanceled = true;
}/**
* 启动超时计时器
*/
public void run()  
{
try {
System.out.println("run()");
Thread.sleep(timeout);
System.out.println("sleep");
if(!isCanceled) throw timeoutException;
} catch (InterruptedException e) {
System.out.println("eeeeeeeeee");
e.printStackTrace();
throw timeoutException;
}   
}}public class MainCheck {/**
* @param args
*/
public static void main(String[] args) {//初始化超时类
System.out.println("main");
TimeoutThread t = new TimeoutThread(1000,new TimeoutException("超时"));
System.out.println("t");
try{
System.out.println("t.start()-begin");
t.start();
System.out.println("t.start()-end");
//.....要检测超时的程序段....
getMothod();
t.cancel();
System.out.println("t.fail="+t.isfail);
System.out.println("t.cancel()-end");
}catch (Exception e)
{
按道理讲应该这里可以捕获到这个异常,可是怎么都进不来
System.out.println("eeeeeeeeeeeee");
//...对超时的处理...}
System.out.println("main==end");
}
public static void getMothod(){
while(true){}
}}

解决方案 »

  1.   

    我就是想在自己的程序里面控制下下述语句的执行时间:
     List synList = getScPerDaySynCheckDao().getSynRes(strDs,sql);如果该语句执行时间超过两秒,那么后续的程序将不再继续执行,程序直接抛出超时异常或返回!
      

  2.   

     一下,用 切面编程 可以解决你的问题吗?java自己就能实现 
      

  3.   

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;import com.sinosoft.lis.db.BOPBATINFDB;
    import com.sinosoft.lis.schema.BOPBATINFSchema;
    import com.sinosoft.utility.DBConn;
    import com.sinosoft.utility.DBConnPool;public class Test {
    /**
     * @param args
     * @throws InterruptedException 
     * @throws SQLException 
     */
    public static void main(String[] args) throws InterruptedException, SQLException {

    Service service = new Service();
    //开启一个线程去执行业务逻辑方法
    System.out.println("测试开始");
    service.start();
    //为了简便我写个简单计时3秒
    Thread.sleep(3000);
    //2秒过后杀死执行业务逻辑方法的线程,停止业务逻辑方法的调用
    //建议调用interrupt()中断程序而不建议调用stop();
    service.interrupt();
    //service.stop();
    System.out.println("测试完毕");
    }
    }class Service extends Thread {
    public void run() {
    //执行业务逻辑方法
    service();
    }

    public void service(){
    try {
    int i=0;
    while(true){

    i++;
    Thread.sleep(1000);
    System.out.println(i);
    }
    } catch (InterruptedException e) {
    //e.printStackTrace();
    System.out.println("程序被中断");
    }
    }

    }