Oddzielnym tematem jest pomiar czasu w Java. Obiekt System daje nam dwie metody pozwalające na odmierzanie czasu i są to: .currentTimeMillis() oraz .nanoTime(), z czego tylko ten pierwszy pozwala na powiązanie z datą. Przykład użycia metod zamieszczony jest poniżej.
public class Czas { public static void main(String[] args) { System.out.println(System.currentTimeMillis()); System.out.println(System.nanoTime()); } }
Mierzenie czasu trwania operacji
Aby wyliczyć czas wykonywania jakiegoś podprogramu (np. w celach testowych gdy staramy się zoptymalizować program pod względem czasu) możemy użyć prostego porównania dwu czasów.
public class CzasMilisekundowy { public static void main(String[] args) { long czas0; czas0=System.currentTimeMillis(); //operacje do wykonania, których czas mierzymy System.out.println(System.currentTimeMillis()-czas0); } }
Można też skorzystać z drugiej metody by określić czas w nanosekundach zamiast milisekund (jeśli ten pomiar okazuje się niewystarczająco dokładny).
public class CzasNanosekundowy{ public static void main(String[] args) { long czas0; czas0=System.nanoTime(); //operacje do wykonania, którego czas mierzymy System.out.println(System.nanoTime()-czas0); } }
Data systemowa
Inną kwestią jest gdy chcemy pobrać datę systemową, wtedy należy skorzystać z dodatkowych bibliotek
import java.sql.Date; import java.time.LocalDate; import java.time.LocalDateTime; public class Data_i_Czas{ public static void main(String[] args) { System.out.println(LocalDate.now()); // na wzór: 2021-12-16 System.out.println(LocalDateTime.now()); // na wzór: 2021-12-16T09:57:43.500 System.out.println(LocalDateTime.now(ZoneId.of("UTC"))); // na wzór j.w. w strefie czasowej UTC (Universal Time Coordinated) } }
Wstrzymanie programu na xxx milisekund
Odrębnym zagadnieniem jest to, gdy chcemy spowodować, aby program zatrzymał się na x sekund. Mozna to w prosty sposób zrobić tak jak poniżej:
public class Data { public static void main(String[] args) { long ileSekundCzekac=5000; System.out.printf("Czekam %10dms... ",ileSekundCzekac); for (long a=System.currentTimeMillis();System.currentTimeMillis()<a+ileSekundCzekac;) ; // <-- pusta pętla System.out.println("Skończyłem czekanie..."); } }
Jednym zdaniem, wykonujemy pustą pętlę dopóki czas systemowy nie będzie się różnił o xxx milisekund od czasu rozpoczęcia tej pętli. Oczywiście wygodnym jest zdefiniowanie metody realizującej czekanie, na przykład takiej jak poniżej…
public static boolean czekaj(long ms) { for (long a=System.currentTimeMillis();System.currentTimeMillis()<a+ms;) ; return true; }
Metoda taka nie wypisuje żadnych komunikatów, przyjmuje jako parametr ilość milisekund do wstrzymania działania w zmiennej typu long i zwraca wartość true na znak, że wykonała się poprawnie.
Wykraczając już daleko poza zakres Podstaw z Języków Programowania można nawiązać jeszcze do jednego sposobu. Wymaga on jedynie przyjęcia “na wiarę”, że istnieją wątki (Thread) w których wykonywany jest program i są metody służące wstrzymywaniu wykonywania danego wątku oraz synchronizacji wątku z innym. Nie wdając się w szczegóły użycie tej metody wygląda tak jak na poniższym przykładzie:
public class Data { public static void main(String[] args) { System.out.println("Czekam kolejne 5s... za pomocą Thread"); try { Thread.sleep(5000); } catch (InterruptedException ex) { System.out.println("Wystąpiło przerwanie..."); } System.out.println("Skończyłem czekanie ... za pomocą Thread"); } }