NUCLI 6 · Sessió 2 · Entorn, fitxers i tasques en paral·lel
La granja de tasques
Sistema a restaurar: Planificador de tasques en paral·lel
- Alerta
- Manual
- Reptes
- Mòdul
Aquest nucli ja està en marxa. Pots tornar-lo a jugar per repassar, però la puntuació desada no canviarà.
Manual del nucli
0 / 3Desbloqueja les 3 pàgines del manual per obrir els reptes. Llegeix-les bé: els reptes en pregunten els detalls.
Exemple 5: directori, entorn i fitxers
Un ProcessBuilder permet decidir on viu el fill, què veu de l'entorn i on van les seves sortides.
ProcessBuilder pb = new ProcessBuilder(Jvm.ordre(Mostrador.class));
pb.directory(carpeta.toFile());
pb.environment().put("SERVIHUB_MODE", "proves");
pb.redirectOutput(new File("sortida/mostrador.log"));
pb.redirectError(ProcessBuilder.Redirect.INHERIT);
int codi = pb.start().waitFor();| Fragment | Què fa |
|---|---|
pb.directory(carpeta.toFile()) | El directori de treball del fill: les rutes relatives que faci servir partiran d'aquí. |
pb.environment().put(…) | Afegeix una variable d'entorn. És una còpia: només la veu el fill, no el pare ni el sistema. |
pb.redirectOutput(new File(…)) | La sortida estàndard del fill va a un fitxer, no a la consola. Ja no cal llegir-la. |
pb.redirectError(Redirect.INHERIT) | La sortida d'error, en canvi, surt a la consola del pare. |
pb.start().waitFor() | Llança i espera en una sola línia. |
Jvm.ordre: llançar classes del mateix projecte
Els fills dels exemples són classes del projecte (Tasca, Mostrador). Jvm.ordre construeix l'ordre amb el mateix executable java que fa servir el pare i el classpath absolut. Així funciona igual a Windows i a Linux, i el fill troba les classes encara que li canviem el directori de treball (amb un classpath relatiu, en canviar de directori, no les trobaria).
String cp = Path.of(System.getProperty("java.class.path")).toAbsolutePath().toString();
String[] base = {executable(), "-cp", cp, classe.getName()};| Fragment | Què fa |
|---|---|
System.getProperty("java.class.path") | El classpath amb què s'executa el pare. |
.toAbsolutePath() | El converteix en ruta absoluta: no depèn del directori de treball. |
{executable(), "-cp", cp, classe.getName()} | java -cp <ruta> cat.pratfp.servihub.sessio2.Tasca, amb cada peça separada. |
Exemple 6: d'una en una o totes alhora
La clau és on poses el waitFor().
// SEQÜENCIAL: llançar i esperar, tres vegades
for (String nom : new String[]{"A", "B", "C"}) {
Process p = new ProcessBuilder(Jvm.ordre(Tasca.class, nom, "2")).inheritIO().start();
p.waitFor();
}
// PARAL·LEL: primer llançar-les totes, després esperar-les totes
List<Process> fills = new ArrayList<>();
for (String nom : new String[]{"D", "E", "F"}) {
fills.add(new ProcessBuilder(Jvm.ordre(Tasca.class, nom, "2")).inheritIO().start());
}
int errors = 0;
for (Process p : fills) {
if (p.waitFor() != 0) errors++;
}| Fragment | Què fa |
|---|---|
p.waitFor() dins del primer for | No es llança la següent fins que acaba l'anterior: 3 × 2 s ≈ 6 s. |
fills.add(… .start()) | Es llancen les tres seguides i es guarden a una llista, sense esperar. |
for (Process p : fills) p.waitFor() | Ara s'esperen totes. Mentre esperes la primera, les altres ja treballen: ≈ 2 s. |
if (p.waitFor() != 0) errors++ | De passada, es compten les que han acabat amb error. |
Nucli restaurat · Planificador de tasques en paral·lel
Granja de tasques en paral·lel. Els sis nuclis tornen a funcionar: el kernel t'espera.
- XP
- 0
- Bonus ratxa
- 0
- Errors
- 0
- Pistes
- 0
- Estrelles
- ☆☆☆
Anota la lletra i la seva posició: al kernel hauràs de compondre l'ordre de reinici.