Ce face Runtime
Fiecare program Java are un singur obiect Runtime, pe care îl obții cu Runtime.getRuntime(); clasa nu se poate instanția cu new. Prin el afli resursele disponibile (procesoare, memorie) și poți înregistra cod care rulează la oprirea programului (addShutdownHook).
availableProcessors() returnează câte procesoare (nuclee logice) poate folosi JVM-ul. Valoarea diferă de la un calculator la altul și poate fi limitată de containere (Docker). Este un punct de plecare bun pentru a decide câte fire de calcul să pornești.
Ce returnează
getRuntime: obiectul Runtime unic. availableProcessors: un int ≥ 1.
Exemple
Exemplul 1: Câte procesoare are calculatorul
Valoarea depinde de calculatorul pe care rulează programul.
public class Main {
public static void main(String[] args) {
Runtime rt = Runtime.getRuntime();
int procesoare = rt.availableProcessors();
System.out.println("Procesoare disponibile: " + procesoare);
System.out.println("Pornesc " + Math.max(1, procesoare - 1) + " fire de calcul");
}
}
Rezultat posibil (diferă de la un calculator la altul)
Procesoare disponibile: 8
Pornesc 7 fire de calcul
Exemplul 2: Un singur obiect Runtime
Afișăm doar verificări care nu depind de calculator.
public class Main {
public static void main(String[] args) {
Runtime a = Runtime.getRuntime();
Runtime b = Runtime.getRuntime();
System.out.println("Același obiect: " + (a == b));
System.out.println("Cel puțin un procesor: " + (a.availableProcessors() >= 1));
a.addShutdownHook(new Thread(() -> System.out.println("Programul se închide, salvez setările.")));
System.out.println("Lucrez...");
}
}
Rezultat
Același obiect: true
Cel puțin un procesor: true
Lucrez...
Programul se închide, salvez setările.
Greșeli frecvente
- Scrii în cod un număr fix de fire (de exemplu 8): pe un server cu 64 de nuclee sau într-un container cu 2 nu se potrivește. Pornește de la
availableProcessors().
Comenzi înrudite
Runtime.totalMemory: totalMemory() dă memoria rezervată acum de JVM, freeMemory() cât din ea este liberă; diferența este memoria folosită.Thread: Un fir de execuție: cod care rulează în paralel cu restul programului. start() îl pornește, join() așteaptă să se termine.System.exit: Oprește imediat programul (JVM-ul) cu un cod de ieșire: 0 înseamnă succes, altă valoare înseamnă eroare.