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

标签 java multithreading concurrency

我有一个方法,它写入数据库。要求是确保此方法在经过一定时间后不会执行。如果它在此之前返回,则不应执行任何操作。

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

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

关于java - 设置方法/线程的最大执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20500003/

相关文章:

java - 调用自定义异常类

java - JNA 和 Java 语言关键字

multithreading - Java EE 响应客户端但继续处理

select - 我可以在不等待 goroutine 返回的情况下强制终止它吗?

java - maven构建使用jdk home\src.zip!\javax\annotation\Resource.java而不是依赖

java - 一个异常工作的java循环,

asp.net - Visual Studio Asp.Net 开发服务器真的是多线程的吗?

c# - 在 C# 中命名同步对象以用于争用分析

java - threadpoolexecutor 中 worker 和 workQueue 的用途

php - 如何在 Laravel Eloquent 中处理多个并发更新?