Estoy tratando de crear una función que recibirá un flujo de cadenas y devolverá una lista ordenada de cadenas que cumplan con todos los siguientes criterios:
Aunque puedo compilar el código, sigo recibiendo un error al probarlo. "java.util.concurrent.TimeoutException"
A continuación se muestra mi función.
....
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()); }.......
A continuación se muestra el stacktrace completo:
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`Según el seguimiento de la pila que compartió, TimeoutException se generó a partir de la invocación del método de bloqueo get de FutureTask .
en java.base/java.util.concurrent.FutureTask.get(FutureTask.java:204)
Específicamente, el método get que ha invocado es el formulario sobrecargado con un tiempo de espera en la entrada, ya que el formulario sin parámetros no genera una TimeoutException .
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/FutureTask.html#get()
El problema no está dentro de su flujo, sino con el tiempo de espera pasado, ya sea porque el valor es demasiado pequeño o el cálculo lleva demasiado tiempo.
En caso de que no se garantice un límite de tiempo superior, es mejor que utilice el formulario de get sin parámetros, ya que bloqueará la ejecución hasta que se complete o se interrumpa al generar la excepción correspondiente.