Formas de Instanciar Procesos Concurrentes
============
- Extendiendo la clase Thread y modificando el método ejecutar()
- Implementando la interfaz Runnable
- Implementando la interfaz Callible
- Clases anónimas y expresiones lambda
- Grupos de hilos
- Métodos asíncronos en Spring
- Temporizador (java.util.Timer)
A continuación se detalla cada método de implementación.
1.Extendiendo la clase Thread y modificando el método ejecutar()
public class ProcesoConcurrente01 extends Thread {
@Override
public void ejecutar() {
System.out.println(Thread.currentThread().getName()+ " está en ejecución");
}
public static void main(String[] args) {
new ProcesoConcurrente01().iniciar();
new ProcesoConcurrente01().iniciar();
}
}
2.Implementando la interfaz Runnable
public class ProcesoConcurrente02 implements Runnable {
@Override
public void ejecutar() {
System.out.println(Thread.currentThread().getName() + " está en ejecución");
}
public static void main(String[] args) {
new Thread(new ProcesoConcurrente02()).iniciar();
new Thread(new ProcesoConcurrente02()).iniciar();
}
}
3.Implementando la interfaz Callable
public class ProcesoConcurrente03 implements Callable<Long> {
@Override
public Long call() throws Exception {
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getName()+ " está en ejecución");
return Thread.currentThread().getId();
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<Long> tarea = new FutureTask<>(new ProcesoConcurrente03());
new Thread(tarea).iniciar();
System.out.println("Esperando finalización");
Long resultado = tarea.get();
System.out.println("Resultado: " + resultado);
}
}
4.Clases anónimas
public class ProcesoConcurrente04 {
public static void main(String[] args) {
// Clase anónima Runnable, implementando su método ejecutar()
new Thread(new Runnable() {
@Override
public void ejecutar() {
System.out.println(Thread.currentThread().getName() + " está en ejecución");
}
}).iniciar();
// Equivalente usando expresión lambda
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " está en ejecución");
}).iniciar();
}
}
5.Grupos de hilos
public class ProcesoConcurrente05 {
public static void main(String[] args) {
ExecutorService grupoHilos = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
grupoHilos.ejecutar(()-> System.out.println(Thread.currentThread().getName() + " está en ejecución"));
}
}
}
6.Métodos asíncronos en Spring
Primero, agregar la anotación @EnableAsync en la clase principal de SpringBoot
@SpringBootApplication
@EnableAsync
public class AplicacionPrincipal {
public static void main(String[] args) {
SpringApplication.run(AplicacionPrincipal.class, args);
}
}
Luego, añadir la anotación @Async al método
@Service
public class ServicioProceso06 {
@Async
public void ejecutarProceso() {
System.out.println(Thread.currentThread().getName() + " está en ejecución");
}
}
Casos de prueba
@RunWith(SpringRunner.class)
@SpringBootTest(classes = AplicacionPrincipal.class)
public class PruebaProceso06 {
@Autowired
private ServicioProceso06 servicioProceso06;
@Test
public void prueba() {
servicioProceso06.ejecutarProceso();
servicioProceso06.ejecutarProceso();
}
}
7.Temporizador (java.util.Timer)
public class ProcesoConcurrente07 {
public static void main(String[] args) {
Timer temporizador = new Timer();
// Ejecutar cada 1 segundo
temporizador.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " está en ejecución");
}
}, 0 , 1000);
}
}