ExecutorService FixedThreadPool como un parámetro compartido que no se ejecuta en paralelo

Estoy tratando de usar un grupo de subprocesos fijos en Java 8 que funciona perfecto siempre que permanezca dentro de la misma función. Una vez que trato de compartir el ejecutor como parámetro, nunca se ejecuta en paralelo.

Esto funciona muy bien:

`` `

public static void test2() {

ExecutorService executor =  Executors.newFixedThreadPool(2);
try {
    CompletionService<Integer> myCompletionService = 
               new ExecutorCompletionService<Integer>(executor);


    myCompletionService.submit(()-> {
        try {
            TimeUnit.SECONDS.sleep(5);
            return 123;
        }
        catch (InterruptedException e) {
            throw new IllegalStateException("task interrupted", e);
        }
    });


    CompletionService<Integer> myCompletionService2 = 
               new ExecutorCompletionService<Integer>(executor);
    myCompletionService2.submit(()-> {
        try {
            TimeUnit.SECONDS.sleep(5);
            return 654;
        }
        catch (InterruptedException e) {
            throw new IllegalStateException("task interrupted", e);
        }
    });

    Future<Integer> myFuture = myCompletionService.take();
    Integer x = myFuture.get();
    System.out.println("Result = " + x);

    Future<Integer> myFuture2 = myCompletionService2.take();
    Integer y = myFuture2.get();
    System.out.println("Result = " + y);

    executor.shutdown();
} catch (InterruptedException | ExecutionException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
}
```

Pero una vez que muevo estos a tres funciones como:

`` `

static Integer t1(ExecutorService executor) throws InterruptedException, ExecutionException {
    CompletionService<Integer> myCompletionService = 
               new ExecutorCompletionService<Integer>(executor);


    myCompletionService.submit(()-> {
        try {
            TimeUnit.SECONDS.sleep(5);
            return 123;
        }
        catch (InterruptedException e) {
            throw new IllegalStateException("task interrupted", e);
        }
    });
    Future<Integer> myFuture = myCompletionService.take();
    return myFuture.get();
}

static Integer t2(ExecutorService executor) throws InterruptedException, ExecutionException {
    CompletionService<Integer> myCompletionService2 = 
               new ExecutorCompletionService<Integer>(executor);


    myCompletionService2.submit(()-> {
        try {
            TimeUnit.SECONDS.sleep(5);
            return 456;
        }
        catch (InterruptedException e) {
            throw new IllegalStateException("task interrupted", e);
        }
    });
    Future<Integer> myFuture2 = myCompletionService2.take();
    return myFuture2.get();
}

static void test3() {
    ExecutorService executor =  Executors.newFixedThreadPool(5);
    try {
        Integer x = t1(executor);
        Integer y = t2(executor);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    executor.shutdown();
}

`` Ahora test3 tomará 10 segundos, donde esperaba que fuera el mismo que el superior, que debería tomar 5 segundos si las cosas se ejecutan en paralelo.

Respuesta 1

Tengo un Edittext, donde quiero permitir solo números y números decimales (máximo 2 decimales después del separador, por ejemplo, 125.50). Implementé un filtro para esto: final EditText field1 = (EditText) ...

¿Hay alguna manera en Intellij para crear un punto de interrupción condicional cuando una clase específica está presente en el stacktrace? Alternativamente, cuando se pasó un punto de interrupción específico en este stacktrace. Ejemplo dado: Let '...

Tengo una entidad llamada MyData. Y estoy tratando de agregar los valores de la entidad MyData a la base de datos. Como a continuación: for (MyDataParent myDataParent: myDataParentList) {MyData myData = new Mydata (); mis datos....

Tengo una matriz int int a1 []; En algún momento de mi código, si se cumplen las condiciones, quiero reemplazar el valor de un [i] en el espacio en blanco. Por ejemplo, si mi salida es: 1 2 3 4 5 6 Quiero hacerlo: 1 2 ...