偶発java時間解析異常
まず2つの異常を貼って、みんなが見たことがあるかどうか分かりません
最近1つのサービス側が複数のクライアントを接続することをテストする時、サービス側はいつもこのような間違いを報告して、自分のdebugはまた用事がなくて、そこで自分でdemoを書きました
上のdemoをテストすると、マルチスレッドの下で9つの異常が投げ出されていることに気づき、APIを調べてみると、次のように書かれています.
クラスSimpleDateFormat
同期
日付フォーマットは非同期です.スレッドごとに独立したフォーマットインスタンスを作成することを推奨します.複数のスレッドが同時に1つのフォーマットにアクセスする場合は、外部同期である必要があります.
心に留める...
興味があるなら、その異常がどのように起こったのか説明しましょう.
Exception in thread "pool-1-thread-42" java.lang.NumberFormatException: multiple points
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1084)
at java.lang.Double.parseDouble(Double.java:510)
at java.text.DigitList.getDouble(DigitList.java:151)
at java.text.DecimalFormat.parse(DecimalFormat.java:1303)
at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1591)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1312)
at java.text.DateFormat.parse(DateFormat.java:335)
at infoair.obcs.utilities.DateTimeUtils.validateDateTime(DateTimeUtils.java:294)
at infoair.obcs.utilities.TestThread.run(DateTimeUtils.java:318)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Exception in thread "pool-1-thread-9" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Long.parseLong(Long.java:431)
at java.lang.Long.parseLong(Long.java:468)
at java.text.DigitList.getLong(DigitList.java:177)
at java.text.DecimalFormat.parse(DecimalFormat.java:1298)
at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1591)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1312)
at java.text.DateFormat.parse(DateFormat.java:335)
at infoair.obcs.utilities.DateTimeUtils.validateDateTime(DateTimeUtils.java:294)
at infoair.obcs.utilities.TestThread.run(DateTimeUtils.java:318)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
最近1つのサービス側が複数のクライアントを接続することをテストする時、サービス側はいつもこのような間違いを報告して、自分のdebugはまた用事がなくて、そこで自分でdemoを書きました
class TestThread extends Thread{
String str = "1251-12-12 03:22:22";
public void run(){
while(true){
Date date = Test.validateDateTime(str);
System.out.println(date);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
}
}
class Test{
public final static SimpleDateFormat dateTimeFormat = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
/**
*
* @param dateStr
* String "yyyy-MM-dd HH:mm:ss"
* @return
*/
public static Date validateDateTime(String dateStr) {
try {
return dateStr == null || dateStr.equals("") ? null
: dateTimeFormat.parse(dateStr);
} catch (ParseException e) {
// e.printStackTrace();
return null;
}
}
public static void main(String[] args) throws InterruptedException {
ExecutorService exe = Executors.newCachedThreadPool();
for (int i = 0; i < 100;i ++){
exe.execute(new TestThread());
}
Thread.sleep(5000);
exe.shutdownNow();
}
}
上のdemoをテストすると、マルチスレッドの下で9つの異常が投げ出されていることに気づき、APIを調べてみると、次のように書かれています.
クラスSimpleDateFormat
同期
日付フォーマットは非同期です.スレッドごとに独立したフォーマットインスタンスを作成することを推奨します.複数のスレッドが同時に1つのフォーマットにアクセスする場合は、外部同期である必要があります.
心に留める...
興味があるなら、その異常がどのように起こったのか説明しましょう.