我有一个方法 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/