JAvaスレッド(メソッド実行)タイムアウト制御
2617 ワード
Layout:post title:「javaスレッド(メソッド実行)タイムアウト制御」date:2013-09-08 22:19:09
categories: java
場合によっては、メソッドの実行時間を制御する必要があり、Thread+Callable+FutureTaskで完了し、Threadは新しいオープンスレッド実行指定メソッドに使用され、CallableとFutrueTaskはメソッドの実行時間を監視するために使用されます.
コードを詳しく見る
いくつかの問題に直面する可能性があります
1.メソッドが元のスレッドで実行されなければならない場合、スレッドの問題.2.パフォーマンスの問題は、新しい2つのスレッドを開いて処理し、実行方法は1つ、監視時間は1つ(推測)です.3.侵入性が強く、結合度が高いため、使用するにはソースコード実装を修正する必要があります.
Hi,2014
categories: java
場合によっては、メソッドの実行時間を制御する必要があり、Thread+Callable+FutureTaskで完了し、Threadは新しいオープンスレッド実行指定メソッドに使用され、CallableとFutrueTaskはメソッドの実行時間を監視するために使用されます.
コードを詳しく見る
import java.lang.reflect.Method;
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<Object> args;//
/**
*
*
* @param cls
* @param method
* @param args
*/
public CallableTask(Object cls, Method method, List<Object> 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.パフォーマンスの問題は、新しい2つのスレッドを開いて処理し、実行方法は1つ、監視時間は1つ(推測)です.3.侵入性が強く、結合度が高いため、使用するにはソースコード実装を修正する必要があります.
Hi,2014