java.util.concurrent.TimeoutException 错误

java.util.concurrent.TimeoutException Error

我正在尝试创建一个将接收字符串流的函数,它将 return 满足以下所有条件的排序字符串列表:

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

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

下面是我的函数。

.....

 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.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`

根据您共享的堆栈跟踪,TimeoutException 已从调用 FutureTask.

的阻塞方法 get 中抛出

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

问题不在您的流中,而是超时已过,因为值太小或计算时间太长。

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