繁体   English   中英

java.util.concurrent.TimeoutException 错误

[英]java.util.concurrent.TimeoutException Error

我正在尝试创建一个 function,它将接收一个 stream 的字符串,并将返回满足以下所有条件的排序字符串列表:

  1. 它们必须包含模式
  2. 字符串长度必须等于或大于最小长度数
  3. 字符串长度必须是偶数或奇数

尽管我能够编译代码,但在测试时仍然出现错误。 “java.util.concurrent.TimeoutException”

下面是我的 function。

....

 public static List<String> findWinners(String pattern, int minLength, boolean even, Stream<String> stream) {
return stream.filter(x -> x.matches(pattern) && x.length() >= minLength).filter(x -> x.length() % 2 == (even ? 0 : 1))
.sorted(new Comparator<String>()
{
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
}).collect(Collectors.toList());
}

…………

以下是完整的堆栈跟踪:

java.util.concurrent.TimeoutException
at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:204)
at homeworkTests.StreamsHomeWorkTest.findWinners(StreamsHomeWorkTest.java:227)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298)
at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.lang.Thread.run(Thread.java:829)`enter code here`

根据您共享的堆栈跟踪,调用FutureTask的阻塞方法get时抛出了TimeoutException

在 java.base/java.util.concurrent.FutureTask.get(FutureTask.java:204)

具体来说,您调用的get方法是输入超时的重载形式,因为无参数形式不会抛出TimeoutException

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/FutureTask.html#get()

问题不在你的 stream 中,而是超时时间过去了,要么是因为值太小,要么是计算时间太长。

如果不能保证上限时间,您最好使用不带参数的get形式,因为它将阻止执行直到完成或通过引发相应的异常而中断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM