ケース(2) - スレッドセーフなオブジェクト(のSimpleDateFormat)

問題の説明:

  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、次のサンプルコードツール:

    (予約)    

   

おすすめ

転載: www.cnblogs.com/chen--biao/p/11351093.html