Pregunta

Estoy confundido en lo siguiente:
Para usar los hilos en un programa Java, la forma más sencilla es extender la clase Thread e implementar la interfaz ejecutable (o simplemente aplicar ejecutable).
Para iniciar la ejecución del hilo. hay que llamar al método start del hilo (), que a su vez llama al método run () de la rosca. Y así el hilo de aperturas.
El método start () (a menos que me equivoque) debe llamarse exactamente y sólo una vez para cada hilo. Como resultado de ello, las instancias de rosca no pueden ser reutilizados a menos que de alguna manera el método de ejecución en sí se ejecuta en algunos corta de bucle infinito que facilita una implementación personalizada de reutilización del hilo.
Ahora el javadoc texto del enlace dice

Las llamadas a ejecutar reutilizará hilos construidos previamente si está disponible

No entiendo cómo esto se lleva a cabo. Proporciono en el método de ejecución del método ejecutor mi costumbre de rosca por ejemplo.

  ExecutorService myCachedPool = Executors.newCachedThreadPool();
  myCachedPool.execute(new Runnable(){public void run(){  
     //do something time consuming

  }});

¿Cómo puede ser esto hilos personalizados me delegeate al marco ejecutor puede reutilizar?
Se está permitido Ejecutor de llamar al método start () más de 1 hora, mientras que no podemos en nuestros programas? Am I malentendido algo?

Gracias.

¿Fue útil?

Solución

Tenga en cuenta que no es Executor que las llamadas start() - es ExecutorService. Y no, no lo está llamando start() dos veces. No se inicia la tarea que se le da directamente a través de Thread.start() ... en cambio, se inicia un hilo que sabe acerca de la cola de trabajo de ese grupo de subprocesos. El hilo básicamente va a esperar hasta que haya un poco de trabajo por hacer, luego recogerlo y ejecutarlo, antes de volver a ir de espera. Así que, aunque los Realiza varias tareas de rosca, Thread.start() sólo se llama una vez.

EDIT:. A juzgar por los comentarios, estás un poco confundido sobre la diferencia entre un Runnable (que es una tarea para ser ejecutada) y un Thread (que es el que ejecuta tareas)

El mismo hilo puede ejecutar múltiples tareas. Para un ejemplo muy simple no se utiliza un grupo de subprocesos, considere esto:

public class MultiRunnable implements Runnable
{
    private final List<Runnable> runnables;

    public MultiRunnable(List<Runnable> runnables)
    {
        this.runnables = runnables;
    }

    public void run()
    {
        for (Runnable runnable : runnables)
        {
             runnable.run();
        }
    }
}

(Ignorar los posibles problemas de seguridad hilo de utilizar un List<T> desde varios subprocesos.)

Se puede crear un montón de tareas Runnable capaces de hacer las cosas diferentes, a continuación, crear una única MultiRunnable para ejecutarlos a su vez. Pasar esa instancia de MultiRunnable al constructor Thread, y luego cuando se inicia el hilo, se ejecutará cada una de las tareas ejecutables originales. ¿Le ayuda?

Otros consejos

No está llamando inicio () más de una vez; en lugar de la rosca en la piscina nunca se completa, pero sólo se mantiene vivo --- esperando. El código fuente está disponible para su descarga si quieres mirarlo.

Cada hilo en el grupo de subprocesos puede simplemente wait() para el Ejecutor que entregar una nueva Ejecutable, pero run() propio método de la rosca no se ha completado. Simplemente espera a que un nuevo Ejecutable que ha de darse al Ejecutor.

a "Inicio" un hilo más de una vez, crear un ejecutable. Por ejemplo:

//NO
private class T extends Thread { //not necessary to implement runnable
    public void run(){
        //...
    }
}
void someMethod(){
    T a = new T();
    a.start();
    a.start(); //NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO
}

En su lugar,

//Yes
private class T implements Runnable {
    public void run(){
        //...
    }
}
void someMethod(){
    T a = new T();
    new Thread(a).start();
    new Thread(a).start(); //YES YES YES
}

También es posible hacer esto:

void someMethod(){
    final Runnable r = new Runnable(){
        public void run(){
            //...
        }
    };
    new Thread(r).start();
    new Thread(r).start();
}
// r could also be a field of you class. 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top