java - 在java中运行一个方法最多预先指定或返回

标签 java executorservice

我有一个方法 m1(),它调用另一个方法 m2()。由于 m2() 是一个长时间运行的方法,我想等待它返回 10 秒,如果没有返回,那么我使用默认值。 Java 有没有一种方法可以让我说运行这个方法最多这么多时间或返回,这样我就不必等待很长时间。 好吧,我可以执行 Thread.currentThread().sleep(x) 但即使我的方法提前返回,我也必须等到 x 时间。

因此,根据答案,我在下面编写了类:

我在Callable中使用sleep,这样它就超过了对get方法的调用,但它仍然返回1。出了什么问题?

   public class RunMethodAtMostForGivenTime
    {
        public static void main(String[] args)
        {
        RunMethodAtMostForGivenTime obj = new RunMethodAtMostForGivenTime();
        System.out.println(obj.sum());
        }

        private int sum()
        {
        int sum = 1;
        ExecutorService service = Executors.newFixedThreadPool(1);
        int returnedInt = 0;
        Future<Integer> calculatedIntFuture = service
            .submit(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception
                {
                Thread.currentThread().sleep(110);
                return new Integer(1);
                }
            });
        try
        {
//here wait is for 10 milliseconds and callable thread sleeps for 110 milliseconds so expected returned value is 0 not 1.
            returnedInt = calculatedIntFuture.get(10, TimeUnit.MILLISECONDS);
            sum += returnedInt;
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        catch (ExecutionException e)
        {
            e.printStackTrace();
        }
        catch (TimeoutException e)
        {
            e.printStackTrace();
        }
        return sum;
        }
    }

最佳答案

您需要另一个线程(可能被 ExecutorService 屏蔽)和标准 Future<T> 。首先将长时间运行的任务包装在 Callable<T> 中:

public class LongRunningTask implements Callable<String> {
  public String call() throws Exception { /* ... */ }
}

然后这样调用它:

ExecutorService service;
LongRunningTask longRunningTask;

public String test() throws Exception {
  Future<?> future = service.submit(longRunningTask);
  return future.get(10, TimeUnit.SECONDS);
}

关于java - 在java中运行一个方法最多预先指定或返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32192470/

相关文章:

java - -Xlint 重新编译。为什么默认不开启?

java - 有没有办法在 Controller 中初始化变量并在 FXML 中使用它?

java - 如何让java执行器具有相同的线程?

multithreading - 在 Spring 中停止线程

java - 在 spring boot Rest API 中关闭 ExecutorService

java - 在单列中组织 JButton?

java - 对象中属性的唯一性

java - Android getDeclaredFields() 返回无序结果

java - 设计 api 获取服务、executorservice 和可变端点列表

java - 寻找具有线程池和最小调度延迟的 ExecutorService