問題の説明:
1は、システム時折例外がスローされます。java.lang.NumberFormatExceptionを:複数のポイントを、うちのクラスのソースをトレース皿:てSimpleDateFormatを
ポジショニングの問題:
1、合計は周知であり、SimpleDateFormatのは、スレッドセーフなクラスではありません。これは、推測することができます:マルチスレッド環境で同時使用する必要があります。
2、シミュレートされた異常が発生します。
エラーコードの例を再現:
パブリッククラススレッドセーフ{ パブリック静的無効メイン(文字列[] args){ てSimpleDateFormatのSDF =新しいてSimpleDateFormat( "YYYY-MM-DD HH:MM:SS")。 新しいスレッド(新しいMyThread1(SDF、 "1991年6月10日午前10時21分10秒")、 "A")(開始)。 新しいスレッド(新しいMyThread1(SDF、 "1991年7月10日午後05時21分19秒")、 "B")(開始)。 新しいスレッド(新しいMyThread1(SDF、 "1989年11月19日午後03時31分40秒")、 "B")(開始)。 新しいスレッド(新しいMyThread1(SDF、 "1999年8月12日13時41分40秒")、 "B")(開始)。 新しいスレッド(新しいMyThread1(SDF、 "2019年6月10日10時23分10秒")、 "B")(開始)。 新しいスレッド(新しいMyThread1(SDF、 "1990年6月10日55:55:55")、 "B")(開始)。 新しいスレッド(新しいMyThread1(SDF、sdf.format(新しいDate()))、」 自衛隊のSimpleDateFormat; 文字列関数datestr; 公共MyThread1(のSimpleDateFormat SDF、文字列関数datestr){ this.sdf = SDF。 this.dateStr = datestrを。 } @Override ます。public void実行(){ ながら(真){ {しようと 文字列の形式= sdf.format(新しいDate()); 日付パース= sdf.parse(フォーマット)。 System.out.println(フォーマット+ " "+ +解析"、" +にThread.currentThread()のgetName()。)。 }キャッチ(例外エラー){ error.printStackTrace()。 System.exitと(-1)。//为了方便查看日志、停掉整个进程 } } } }
完全な例外スタック情報は次のとおりです。
java.lang.NumberFormatException:複数の点 sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1890)で sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)で java.lang.Double.parseDoubleで(Double.java :538) java.text.DigitList.getDouble(DigitList.java:169)で java.text.DecimalFormat.parse(DecimalFormat.java:2056)で java.text.SimpleDateFormat.subParseで(SimpleDateFormat.java:1869)
問題解決:
スレッド、独特のSimpleDateFormatように1は、結合のSimpleDateFormatにThreadLocalは、ツールを構築します。
2、次のサンプルコードツール:
(予約)