java 线程超时_java线程(方法运行)超时控制

在某些情况下需要控制方法的运行时间,通过Thread+Callable+FutureTask完成,Thread用于新开线程运行指定方法,Callable和FutrueTask用于监控方法运行时间。

详细看代码

package com.budingge.like;

import java.lang.reflect.Method;

import java.util.List;

import java.util.concurrent.Callable;

import java.util.concurrent.FutureTask;

import java.util.concurrent.TimeUnit;

/**

* java方法运行超时控制

* #在某些情况下需要限制运行时间,超过既定时间久终止运行。

* @author budingge.com

*

*/

public class RuntimeOutControl {

//被测试方法

public void task() throws InterruptedException {

//睡眠1s

Thread.sleep(1000);

for (int i = 0; i < 1000; i++) {

System.out.println("no.:" + i);

}

System.out.println("finished:test");

}

//测试

public void test() throws Exception {

//反射区方法

Method method = getClass().getDeclaredMethod("task", null);

//创建线程实例

Callable call = new CallableTask(this, method, null);

//使用FutureTask具备返回值的线程监控类

FutureTask task = new FutureTask(call);

//创建Thread,用于运行task

Thread thead = new Thread(task);

//设置为后台线程

thead.setDaemon(true);

//启动线程

thead.start();

try {

//设置timeout时间,查看返回结果

task.get(1, TimeUnit.SECONDS);

} catch (Exception e) {

System.out.println(task);

e.printStackTrace();

}

}

public static void main(String[] args) throws Exception {

RuntimeOutControl roc = new RuntimeOutControl();

roc.test();

}

}

/**

* 实现Callable接口,具备线程能力,用于执行被监控方法

*

* @author budingge.com

*

*/

class CallableTask implements Callable {

Object cls;// 类实例

Method method;// 要执行类方法

List args;// 参数

/**

* 构造器

*

* @param cls

* @param method

* @param args

*/

public CallableTask(Object cls, Method method, List args) {

super();

this.cls = cls;

this.method = method;

this.args = args;

}

@Override

public Object call() throws Exception {

Object rs = null;

// 反射调用方法

if (args == null) {

rs = method.invoke(cls);

} else {

rs = method.invoke(cls, args.toArray());

}

return rs;

}

}

可能面临几个问题,

1.线程问题,如果方法必需在原来线程中执行,那该如何。

2.性能问题,新开了两个线程来处理,运行方法一个,监控时间一个(猜测)。

3.侵入性太强,耦合度高,如果想使用,必需修改源代码实现。

Hi,2014

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值