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

我有一个方法,可以写入数据库。要求是确保经过一定时间后该方法不执行。如果在此之前返回,则什么也不做。

我能想到的一种基本方法就是这样做。

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执行该方法的对象?

回答:

您可以通过将工作发送给执行者来做到这一点:

 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();

}

}

以上是 设置方法/线程的最大执行时间 的全部内容, 来源链接: utcz.com/qa/398638.html

回到顶部