Skip to content

Commit fdf761f

Browse files
authored
Merge pull request mouredev#6413 from eulogioep/main
#15 - java, javascript, php y typescript
2 parents 90037ce + ed78861 commit fdf761f

File tree

8 files changed

+789
-0
lines changed

8 files changed

+789
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import java.util.concurrent.CompletableFuture;
2+
import java.util.concurrent.ExecutorService;
3+
import java.util.concurrent.Executors;
4+
import java.util.concurrent.TimeUnit;
5+
6+
public class eulogioep {
7+
8+
/**
9+
* Método principal que demuestra el uso de asincronía en Java
10+
*/
11+
public static void main(String[] args) {
12+
// Demostración básica
13+
System.out.println("=== Demostración Básica ===");
14+
ejecutarTareaAsincrona("TareaEjemplo", 2);
15+
16+
// Para asegurar que la demostración básica termine antes de la extra
17+
try {
18+
Thread.sleep(3000);
19+
} catch (InterruptedException e) {
20+
e.printStackTrace();
21+
}
22+
23+
// Dificultad Extra
24+
System.out.println("\n=== Dificultad Extra ===");
25+
dificultadExtra();
26+
}
27+
28+
/**
29+
* Ejecuta una tarea asíncrona con un nombre y duración especificados
30+
* @param nombre Nombre de la tarea
31+
* @param segundos Duración de la tarea en segundos
32+
* @return CompletableFuture<Void> que representa la tarea asíncrona
33+
*/
34+
public static CompletableFuture<Void> ejecutarTareaAsincrona(String nombre, int segundos) {
35+
return CompletableFuture.runAsync(() -> {
36+
try {
37+
System.out.println(nombre + " - Iniciando...");
38+
System.out.println(nombre + " - Durará " + segundos + " segundos");
39+
Thread.sleep(segundos * 1000);
40+
System.out.println(nombre + " - Finalizada");
41+
} catch (InterruptedException e) {
42+
e.printStackTrace();
43+
}
44+
});
45+
}
46+
47+
/**
48+
* Implementación de la dificultad extra
49+
* Ejecuta las tareas C, B y A en paralelo y luego D cuando las anteriores terminan
50+
*/
51+
public static void dificultadExtra() {
52+
// Crear un ExecutorService para manejar los hilos
53+
ExecutorService executor = Executors.newFixedThreadPool(3);
54+
55+
// Crear las tareas asíncronas
56+
CompletableFuture<Void> tareaC = ejecutarTareaAsincrona("Tarea C", 3);
57+
CompletableFuture<Void> tareaB = ejecutarTareaAsincrona("Tarea B", 2);
58+
CompletableFuture<Void> tareaA = ejecutarTareaAsincrona("Tarea A", 1);
59+
60+
// Esperar a que todas las tareas terminen y luego ejecutar D
61+
CompletableFuture.allOf(tareaC, tareaB, tareaA)
62+
.thenRun(() -> ejecutarTareaAsincrona("Tarea D", 1));
63+
64+
// Esperar a que todo termine antes de cerrar el programa
65+
try {
66+
executor.shutdown();
67+
executor.awaitTermination(10, TimeUnit.SECONDS);
68+
} catch (InterruptedException e) {
69+
e.printStackTrace();
70+
}
71+
}
72+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/**
2+
* Función asíncrona que simula una tarea que tarda un tiempo específico
3+
* @param {string} nombre - Nombre de la tarea
4+
* @param {number} segundos - Duración de la tarea en segundos
5+
* @returns {Promise} Una promesa que se resuelve cuando la tarea termina
6+
*/
7+
function ejecutarTareaAsincrona(nombre, segundos) {
8+
return new Promise(resolve => {
9+
console.log(`${nombre} - Iniciando...`);
10+
console.log(`${nombre} - Durará ${segundos} segundos`);
11+
12+
setTimeout(() => {
13+
console.log(`${nombre} - Finalizada`);
14+
resolve();
15+
}, segundos * 1000);
16+
});
17+
}
18+
19+
/**
20+
* Demostración básica de una tarea asíncrona
21+
*/
22+
async function demostracionBasica() {
23+
console.log("=== Demostración Básica ===");
24+
await ejecutarTareaAsincrona("TareaEjemplo", 2);
25+
}
26+
27+
/**
28+
* Implementación de la dificultad extra
29+
* Ejecuta las tareas C, B y A en paralelo y luego D cuando las anteriores terminan
30+
*/
31+
async function dificultadExtra() {
32+
console.log("\n=== Dificultad Extra ===");
33+
34+
// Ejecutar tareas C, B y A en paralelo
35+
const tareaC = ejecutarTareaAsincrona("Tarea C", 3);
36+
const tareaB = ejecutarTareaAsincrona("Tarea B", 2);
37+
const tareaA = ejecutarTareaAsincrona("Tarea A", 1);
38+
39+
// Esperar a que todas las tareas terminen
40+
await Promise.all([tareaC, tareaB, tareaA]);
41+
42+
// Ejecutar tarea D después de que las otras hayan terminado
43+
await ejecutarTareaAsincrona("Tarea D", 1);
44+
}
45+
46+
/**
47+
* Función principal que ejecuta todas las demostraciones
48+
*/
49+
async function main() {
50+
await demostracionBasica();
51+
await dificultadExtra();
52+
}
53+
54+
// Ejecutar el programa
55+
main().catch(error => console.error('Error:', error));
+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
<?php
2+
3+
/**
4+
* Clase para manejar tareas asíncronas
5+
*/
6+
class TareaAsincrona {
7+
private $nombre;
8+
private $segundos;
9+
private $pid;
10+
11+
/**
12+
* Constructor de la clase
13+
* @param string $nombre Nombre de la tarea
14+
* @param int $segundos Duración de la tarea en segundos
15+
*/
16+
public function __construct($nombre, $segundos) {
17+
$this->nombre = $nombre;
18+
$this->segundos = $segundos;
19+
}
20+
21+
/**
22+
* Ejecuta la tarea de forma asíncrona
23+
* @return bool True si la tarea se inició correctamente
24+
*/
25+
public function ejecutar() {
26+
// Crear un proceso hijo
27+
$pid = pcntl_fork();
28+
29+
if ($pid == -1) {
30+
die("No se pudo crear el proceso hijo\n");
31+
} else if ($pid) {
32+
// Proceso padre
33+
$this->pid = $pid;
34+
return true;
35+
} else {
36+
// Proceso hijo
37+
echo "{$this->nombre} - Iniciando...\n";
38+
echo "{$this->nombre} - Durará {$this->segundos} segundos\n";
39+
sleep($this->segundos);
40+
echo "{$this->nombre} - Finalizada\n";
41+
exit(0);
42+
}
43+
}
44+
45+
/**
46+
* Espera a que la tarea termine
47+
*/
48+
public function esperar() {
49+
if ($this->pid) {
50+
pcntl_waitpid($this->pid, $status);
51+
}
52+
}
53+
}
54+
55+
/**
56+
* Demostración básica de una tarea asíncrona
57+
*/
58+
function demostracionBasica() {
59+
echo "=== Demostración Básica ===\n";
60+
$tarea = new TareaAsincrona("TareaEjemplo", 2);
61+
$tarea->ejecutar();
62+
$tarea->esperar();
63+
}
64+
65+
/**
66+
* Implementación de la dificultad extra
67+
*/
68+
function dificultadExtra() {
69+
echo "\n=== Dificultad Extra ===\n";
70+
71+
// Crear las tareas
72+
$tareaC = new TareaAsincrona("Tarea C", 3);
73+
$tareaB = new TareaAsincrona("Tarea B", 2);
74+
$tareaA = new TareaAsincrona("Tarea A", 1);
75+
$tareaD = new TareaAsincrona("Tarea D", 1);
76+
77+
// Ejecutar C, B y A en paralelo
78+
$tareaC->ejecutar();
79+
$tareaB->ejecutar();
80+
$tareaA->ejecutar();
81+
82+
// Esperar a que terminen C, B y A
83+
$tareaC->esperar();
84+
$tareaB->esperar();
85+
$tareaA->esperar();
86+
87+
// Ejecutar D después de que las otras hayan terminado
88+
$tareaD->ejecutar();
89+
$tareaD->esperar();
90+
}
91+
92+
// Función principal
93+
function main() {
94+
demostracionBasica();
95+
dificultadExtra();
96+
}
97+
98+
// Ejecutar el programa
99+
main();
100+
101+
?>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
/**
2+
* Interfaz que define la estructura de una tarea asíncrona
3+
*/
4+
interface AsyncTask {
5+
name: string;
6+
duration: number;
7+
status: 'pending' | 'running' | 'completed';
8+
startTime?: Date;
9+
endTime?: Date;
10+
}
11+
12+
/**
13+
* Clase que implementa una tarea asíncrona
14+
*/
15+
class Task implements AsyncTask {
16+
public status: 'pending' | 'running' | 'completed' = 'pending';
17+
public startTime?: Date;
18+
public endTime?: Date;
19+
20+
constructor(
21+
public name: string,
22+
public duration: number
23+
) {}
24+
25+
/**
26+
* Ejecuta la tarea y retorna una promesa
27+
* @returns Promise<void>
28+
*/
29+
async execute(): Promise<void> {
30+
this.status = 'running';
31+
this.startTime = new Date();
32+
33+
console.log(`${this.name} - Iniciando...`);
34+
console.log(`${this.name} - Durará ${this.duration} segundos`);
35+
36+
return new Promise<void>((resolve) => {
37+
setTimeout(() => {
38+
this.status = 'completed';
39+
this.endTime = new Date();
40+
console.log(`${this.name} - Finalizada`);
41+
resolve();
42+
}, this.duration * 1000);
43+
});
44+
}
45+
}
46+
47+
/**
48+
* Clase que gestiona la ejecución de tareas asíncronas
49+
*/
50+
class TaskManager {
51+
private tasks: Map<string, Task> = new Map();
52+
53+
/**
54+
* Añade una nueva tarea al gestor
55+
* @param name Nombre de la tarea
56+
* @param duration Duración en segundos
57+
*/
58+
addTask(name: string, duration: number): void {
59+
this.tasks.set(name, new Task(name, duration));
60+
}
61+
62+
/**
63+
* Ejecuta una demostración básica con una sola tarea
64+
*/
65+
async runBasicDemo(): Promise<void> {
66+
console.log("=== Demostración Básica ===");
67+
const task = new Task("TareaEjemplo", 2);
68+
await task.execute();
69+
}
70+
71+
/**
72+
* Ejecuta la dificultad extra del ejercicio
73+
*/
74+
async runExtraChallenge(): Promise<void> {
75+
console.log("\n=== Dificultad Extra ===");
76+
77+
// Crear tareas
78+
this.addTask("Tarea C", 3);
79+
this.addTask("Tarea B", 2);
80+
this.addTask("Tarea A", 1);
81+
this.addTask("Tarea D", 1);
82+
83+
// Ejecutar tareas C, B y A en paralelo
84+
const parallelTasks = ["Tarea C", "Tarea B", "Tarea A"].map(name =>
85+
this.tasks.get(name)!.execute()
86+
);
87+
88+
// Esperar a que terminen las tareas paralelas
89+
await Promise.all(parallelTasks);
90+
91+
// Ejecutar tarea D
92+
await this.tasks.get("Tarea D")!.execute();
93+
}
94+
95+
/**
96+
* Obtiene estadísticas de ejecución de las tareas
97+
*/
98+
getStats(): string {
99+
let stats = "\nEstadísticas de ejecución:\n";
100+
this.tasks.forEach(task => {
101+
if (task.startTime && task.endTime) {
102+
const executionTime =
103+
(task.endTime.getTime() - task.startTime.getTime()) / 1000;
104+
stats += `${task.name}: ${executionTime.toFixed(2)} segundos\n`;
105+
}
106+
});
107+
return stats;
108+
}
109+
}
110+
111+
/**
112+
* Función principal que ejecuta todo el programa
113+
*/
114+
async function main(): Promise<void> {
115+
const manager = new TaskManager();
116+
117+
try {
118+
await manager.runBasicDemo();
119+
await manager.runExtraChallenge();
120+
console.log(manager.getStats());
121+
} catch (error) {
122+
console.error("Error durante la ejecución:", error);
123+
}
124+
}
125+
126+
// Ejecutar el programa
127+
main().catch(error => console.error('Error:', error));
128+
129+
// Para compilar: tsc nombrearchivo.ts
130+
// Para ejecutar: node nombrearchivo.js

0 commit comments

Comments
 (0)