Pregunta

Soy bastante ingenuo cuando se trata del mundo de Java Threading and Concurrency. Actualmente estoy tratando de aprender. Hice un ejemplo simple para tratar de averiguar cómo funciona la concurrencia.

Aquí está mi código:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadedService {

    private ExecutorService exec;

    /**
     * @param delegate
     * @param poolSize
     */
    public ThreadedService(int poolSize) {
        if (poolSize < 1) {
            this.exec = Executors.newCachedThreadPool();
        } else {
            this.exec = Executors.newFixedThreadPool(poolSize);
        }
    }

    public void add(final String str) {
        exec.execute(new Runnable() {
            public void run() {
                System.out.println(str);
            }

        });

    }

    public static void main(String args[]) {
        ThreadedService t = new ThreadedService(25);
        for (int i = 0; i < 100; i++) {
            t.add("ADD: " + i);
        }
    }

}

¿Qué debo hacer para que el código imprima los números 0-99 en orden secuencial?

¿Fue útil?

Solución

Grupos de subprocesos se usan generalmente para operaciones que no necesitan sincronización o son altamente paralelo .

La impresión secuencial de los números 0-99 no es un problema concurrente y requiere que los hilos estén sincronizados para evitar que se imprima fuera de orden.

Recomiendo echar un vistazo a la Lección de concurrencia de Java para tener una idea de la concurrencia en Java.

Otros consejos

La idea de los hilos no es hacer las cosas secuencialmente.

Necesitarás un estado compartido para coordinar. En el ejemplo, agregar campos de instancia a su clase externa funcionará en este ejemplo. Eliminar el parámetro de agregar. Añadir un objeto de bloqueo y un contador. Agarre el bloqueo, imprima el número de forma incremental, incremente el número y suelte el número.

La solución más sencilla para su problema es usar un tamaño de ThreadPool de 1. Sin embargo, este no es realmente el tipo de problema que se usaría para resolver los subprocesos.

Para expandir, si creas tu ejecutor con:

this.exec = Executors.newSingleThreadExecutor();

entonces sus hilos serán programados y ejecutados en el orden en que fueron enviados para su ejecución. Hay algunos escenarios en los que esto es lógico, pero en la mayoría de los casos, los subprocesos son la herramienta incorrecta que se utiliza para resolver este problema.

Este tipo de cosas tiene sentido cuando se necesita ejecutar la tarea en un subproceso diferente, tal vez demore mucho tiempo en ejecutarse y no quiera bloquear un subproceso de la GUI, pero no necesita o no quiere que las tareas enviadas se ejecuten al mismo tiempo.

Por definición, el problema no es adecuado para subprocesos. Los subprocesos se ejecutan de forma independiente y realmente no hay una manera de predecir qué subproceso se ejecuta primero.

Si desea cambiar su código para que se ejecute secuencialmente, cambie agregar a:

public void add(final String str) {
    System.out.println(str);
}

No estás usando hilos (al menos no los tuyos) y todo sucede de forma secuencial.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top