java—设置方法/线程的最大执行时间

bvuwiixz  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(891)

我有一个方法,可以写入数据库。要求是确保此方法不会在经过特定时间后执行。如果它在那之前返回,那么什么也不应该做。
我能想到的一个基本方法就是这样做。

public class LimitedRuntime {

    public static void writeToDb(){
            // writes to the database
    }

    public static void main(String[] args) {
        long totalExecutionTime = 8000L;
        long startTime = System.currentTimeMillis();

        while(System.currentTimeMillis() - startTime < totalExecutionTime )
        {
            writeToDb();
        }   
    }
}

这种方法的一个问题是,即使方法在最大总执行时间之前返回,程序也会停止以等待时间流逝。
我怎样才能做得更好(或者更正确)?如果我们使用 Thread ,我们怎样才能知道 Thread 执行那个方法?

f3temu5u

f3temu5u1#

您可以将您的工作发送给执行人:

public static void main(String[] args) {
    ExecutorService executor = Executors.newFixedThreadPool(4);

    Future<?> future = executor.submit(new Runnable() {
        @Override
        public void run() {
            writeToDb();            //        <-- your job
        }
    });

    executor.shutdown();            //        <-- reject all further submissions

    try {
        future.get(8, TimeUnit.SECONDS);  //     <-- wait 8 seconds to finish
    } catch (InterruptedException e) {    //     <-- possible error cases
        System.out.println("job was interrupted");
    } catch (ExecutionException e) {
        System.out.println("caught exception: " + e.getCause());
    } catch (TimeoutException e) {
        future.cancel(true);              //     <-- interrupt the job
        System.out.println("timeout");
    }

    // wait all unfinished tasks for 2 sec
    if(!executor.awaitTermination(2, TimeUnit.SECONDS)){
        // force them to quit by interrupting
        executor.shutdownNow();
    }
}
sxpgvts3

sxpgvts32#

还有一个aspectj解决方案,它使用jcabi方面库:

@Timeable(limit = 5, unit = TimeUnit.SECONDS)
public String writeToDb() {
  // writeToDb
}

有一篇文章对此作了进一步的解释:限制java方法的执行时间

相关问题