Hallo. Es ist Kecho. ** Verwendet ihr SimpleDateFormat und Stream? ** **. Es ist eine Nische. Ich liebe Stream. Dieses Mal werden wir überprüfen, ob SimpleDateFormat Thread-unsicher ist.
Bereiten Sie zunächst ein Objekt vom Typ Datum vor.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
Calendar day1 = Calendar.getInstance();
day1.set(2020, 0, 31, 0, 0, 0);
Calendar day2 = Calendar.getInstance();
day2.set(1995, 3, 6, 0, 0, 0);
Lassen Sie es uns in die Liste aufnehmen.
for (int i = 0; i < 10; i++) {
//Pack 20 Datumsobjekte in die Liste
list.add(day1.getTime());
list.add(day2.getTime());
}
Erstens, ohne parallel auszuführen.
list.stream().map(date -> sdf.format(date)).forEach(System.out::println);
//Konvertieren Sie jedes Element nacheinander in String und geben Sie es aus
Das ganze Bild ist unten.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
Calendar day1 = Calendar.getInstance();
day1.set(2020, 0, 31, 0, 0, 0);
Calendar day2 = Calendar.getInstance();
day2.set(1995, 3, 6, 0, 0, 0);
List<Date> list = new ArrayList<>(); //Liste erstellen
for (int i = 0; i < 10; i++) {
//Füllen Sie die Liste mit Datumsobjekten
list.add(day1.getTime());
list.add(day2.getTime());
}
list.stream().map(date -> sdf.format(date)).forEach(System.out::println);
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
Es scheint kein Problem zu geben.
Der Stream wird parallel verarbeitet, indem der Zwischenoperation parallel () hinzugefügt wird.
list.stream().map(date -> sdf.format(date)).forEach(System.out::println);
Machen wir das!
2020/01/31 12:00:00
1995/01/31 12:00:00 //was ist das
1995/04/06 12:00:00
2020/01/31 12:00:00
2020/01/31 12:00:00
2020/01/31 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/06 12:00:00
2020/01/31 12:00:00
1995/04/31 12:00:00 //was ist das
Einige unerwartete Daten wurden ausgegeben. Ich konnte bestätigen, dass der Thread unsicher ist.
Sie können in jedem Thread ein SimpleDateFormat-Objekt erstellen. Grundsätzlich ist es besser, die von Java 8 implementierte Datums- und Uhrzeit-API zu verwenden.
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd hh:mm:ss");
LocalDateTime today = LocalDateTime.now();
LocalDateTime birthDay = LocalDateTime.of(1995, 4, 6, 12, 0, 0);
List<LocalDateTime> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
//Füllen Sie die Liste mit Datumsobjekten
list.add(today);
list.add(birthDay);
}
list.stream().parallel().map(date -> dtf.format(date)).forEach(System.out::println);
2020/01/31 09:33:20
1995/04/06 12:00:00
1995/04/06 12:00:00
2020/01/31 09:33:20
1995/04/06 12:00:00
2020/01/31 09:33:20
2020/01/31 09:33:20
2020/01/31 09:33:20
2020/01/31 09:33:20
2020/01/31 09:33:20
2020/01/31 09:33:20
1995/04/06 12:00:00
1995/04/06 12:00:00
1995/04/06 12:00:00
1995/04/06 12:00:00
1995/04/06 12:00:00
2020/01/31 09:33:20
2020/01/31 09:33:20
1995/04/06 12:00:00
1995/04/06 12:00:00
Klingt okay.
Verwenden Sie die Datums- und Uhrzeit-API für Java 8 und höher
Recommended Posts