JAvaスレッド(メソッド実行)タイムアウト制御

2617 ワード

Layout:post title:「javaスレッド(メソッド実行)タイムアウト制御」date:2013-09-08 22:19:09
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