Red de conocimiento de abogados - Derecho de sociedades - Cómo establecer la prioridad del servicio ejecutor programado

Cómo establecer la prioridad del servicio ejecutor programado

ScheduledExecutorService extiende la interfaz ExecutorService para proporcionar funciones de programación de tiempo, principalmente de la siguiente manera:

la programación (invocable, retardo largo, unidad TimeUnit) se crea y ejecuta después de un retraso determinado. .

schedule(comando ejecutable, retraso largo, unidad TimeUnit) Crea y ejecuta una operación única habilitada después de un retraso determinado.

scheduleAtFixedRate(Comando ejecutable, retardo inicial largo, período largo, Unidad de tiempo)

Crea y ejecuta una operación periódica que se habilita por primera vez después de un retraso inicial determinado, con operaciones posteriores que tienen el período determinado ;Es decir, comenzará a ejecutarse después del retardo inicial, luego se ejecutará después del período de retardo inicial, luego se ejecutará después del período de retardo inicial 2 *, y así sucesivamente.

scheduleWithFixedDelay(Comando ejecutable, retardo inicial largo, retardo largo, unidad TimeUnit)

Crea y ejecuta una operación periódica que se habilita primero después de un retraso inicial determinado y, posteriormente, cada vez que se ejecuta Hay un retraso determinado entre la terminación y el inicio de la siguiente ejecución.

El método de programación se utiliza para retrasar la ejecución de una tarea específica en un tiempo específico. Si necesita ejecutar una tarea programada periódicamente, puede utilizar el método ScheduleAtFixedRate o ScheduleWithFixedDelay. La diferencia entre ellos es que el primero se ejecuta con una frecuencia fija y el segundo se ejecuta con una frecuencia relativamente fija.

No importa si el tiempo de ejecución de la tarea es mayor que el intervalo, ScheduleAtFixedRate y ScheduleWithFixedDelay no harán que la misma tarea se ejecute simultáneamente. La única diferencia es que ScheduleWithFixedDelay es el momento en que finaliza la tarea actual y comienza el intervalo de liquidación. Por ejemplo, la primera tarea comienza en 0 segundos, la tarea tarda 5 segundos y el intervalo de tarea es de 3 segundos, luego se ejecuta la segunda tarea. El tiempo comienza a los 8 segundos.

La clase de implementación de ScheduledExecutorService es ScheduledThreadPoolExecutor. La cantidad de subprocesos contenidos en el objeto ScheduledThreadPoolExecutor no es escalable, solo habrá una cantidad fija de subprocesos. Sin embargo, puede establecer la prioridad del subproceso a través de su constructor para reducir el uso del sistema del subproceso de la tarea programada.

Consejo especial: para tareas periódicas ejecutadas a través de ScheduledExecutorService, si se produce una excepción durante la ejecución de la tarea, ScheduledExecutorService dejará de ejecutar la tarea y la tarea ya no se ejecutará periódicamente. Entonces, si desea que la tarea siga ejecutándose periódicamente, detecte todas las excepciones posibles.

prueba de paquete;

importar java.text.SimpleDateFormat;

importar java.util.Date;

importar java.util. concurrent.ScheduledThreadPoolExecutor;

importar java.util.concurrent.TimeUnit;

/**

* crear el 10-11-14

* @author KETQI

* @category

*/

clase pública TestScheduledThreadPoolExecutor {

formato SimpleDateFormat estático privado = nuevo SimpleDateFormat ("aaaa-MM-dd HH:mm:ss");

public static void main(String[] args) {

//ScheduledExecutorService exec=Executors.newScheduledThreadPool(1 );

ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);

/**

*Imprime la hora del sistema de vez en cuando, sin afectarse entre sí. br/gt;

* Crea y ejecuta una operación periódica que se habilita por primera vez después de un retraso inicial determinado, y las operaciones posteriores tienen el período determinado lt; * Es decir, se ejecutará después del retardo inicial, luego se ejecutará después del período de retardo inicial, lt; br/gt;

* Luego se ejecutará después del período de retardo inicial 2 *, y así sucesivamente.

*/

exec.scheduleAtFixedRate(new Runnable() {

public void run() {

System.out.println (format.format(new Date()));

}

}, 1000, 5000, TimeUnit.MILLISECONDS);

//Después de iniciar la ejecución Si se activa una excepción, el siguiente ciclo no se ejecutará

exec.scheduleAtFixedRate(new Runnable() {

public void run() {

System. out. println("RuntimeException no se detecta, la próxima vez no se puede ejecutar");

throw new RuntimeException();

}

}, 1000, 5000, TimeUnit.MILLISECONDS);

//Aunque se lanza una excepción en ejecución, cuando se intercepta, el siguiente ciclo continúa ejecutándose

exec.scheduleAtFixedRate(new Runnable() {

public void run() {

intentar{

lanzar nueva RuntimeException();

}catch (Exception e){

System.out.println("RuntimeException detectada, se puede ejecutar a continuación");

}

}

}, 1000, 5000, TimeUnit. .MILLISECONDS );

/**

* Crea y ejecuta una operación periódica que se habilita por primera vez después de un retraso inicial determinado, lt/gt; > * Posteriormente, existe un retraso determinado entre la finalización de cada ejecución y el inicio de la siguiente ejecución.

*/

exec.scheduleWithFixedDelay(new Runnable() {

public void run() {

System.out.println ("scheduleWithFixedDelay: comenzar", format.format(new Date()));

prueba {

Thread.sleep(2000);

} captura (InterruptedException e) {

e.printStackTrace();

}

System.out.println("scheduleWithFixedDelay: end", format.format(new Fecha()));

}

}, 1000, 5000, TimeUnit.MILLISECONDS

/**

*); Crea y ejecuta una operación única que se habilita después de un retraso determinado.

*/

exec.schedule(new Runnable() {

public void run() {

System.out.println ("¡El hilo solo puede ejecutarse una vez!");

}

}, 5000, TimeUnit.MILLISECONDS

}

}