SORU
26 EKİM 2010, Salı


"Java tarih biçimi iş parçacığı için güvenli" bu yol nedir?

Herkes tarih biçimi ile ilgili Java iş parçacığı güvenli değil varlık ve kavramı teorik olarak anlıyorum uyardı.

Ama bu nedeniyle yüzleşebiliriz ne görselleştirmek için güçlü değilim. Diyelim ki bir sınıfta tarih biçimi bir alan var ve aynı şekilde bir çok iş parçacıklı ortamda sınıf (tarih biçimi) farklı yöntemler kullanılır.

Bu neden olur:

  • format istisnası gibi herhangi bir istisna
  • verilerde tutarsızlık
  • başka sorun?

Ayrıca, lütfen nedenini açıklayınız.

CEVAP
26 EKİM 2010, Salı


Deneyelim görelim.

Burada, birden çok iş parçacığı SimpleDateFormat Bir ortak kullanım bir program.

Program:

public static void main(String[] args) throws Exception {

    final DateFormat format = new SimpleDateFormat("yyyyMMdd");

    Callable<Date> task = new Callable<Date>(){
        public Date call() throws Exception {
            return format.parse("20101022");
        }
    };

    //pool with 5 threads
    ExecutorService exec = Executors.newFixedThreadPool(5);
    List<Future<Date>> results = new ArrayList<Future<Date>>();

    //perform 10 date conversions
    for(int i = 0 ; i < 10 ; i  ){
        results.add(exec.submit(task));
    }
    exec.shutdown();

    //look at the results
    for(Future<Date> result : results){
        System.out.println(result.get());
    }
}

Bu birkaç kez çalıştırın ve göreceksiniz:

Özel durumlar:

İşte birkaç örnek:

1.

Caused by: 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:1589)

2.

Caused by: java.lang.NumberFormatException: For input string: ".10201E.102014E4"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)
    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:1589)

3.

Caused by: 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:1936)
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1312)

Yanlış Sonuçlar:

Sat Oct 22 00:00:00 BST 2011
Thu Jan 22 00:00:00 GMT 1970
Fri Oct 22 00:00:00 BST 2010
Fri Oct 22 00:00:00 BST 2010
Fri Oct 22 00:00:00 BST 2010
Thu Oct 22 00:00:00 GMT 1970
Fri Oct 22 00:00:00 BST 2010
Fri Oct 22 00:00:00 BST 2010
Fri Oct 22 00:00:00 BST 2010
Fri Oct 22 00:00:00 BST 2010

Sonuçlar Doğru:

Fri Oct 22 00:00:00 BST 2010
Fri Oct 22 00:00:00 BST 2010
Fri Oct 22 00:00:00 BST 2010
Fri Oct 22 00:00:00 BST 2010
Fri Oct 22 00:00:00 BST 2010
Fri Oct 22 00:00:00 BST 2010
Fri Oct 22 00:00:00 BST 2010
Fri Oct 22 00:00:00 BST 2010
Fri Oct 22 00:00:00 BST 2010
Fri Oct 22 00:00:00 BST 2010

Başka bir yaklaşım için güvenli bir şekilde kullanmak DateFormats bir çok iş parçacıklı ortamda kullanmak ThreadLocal değişken için basılı tutun DateFormat nesne anlamına gelir, her iş parçacığı olacak kendi kopyalayıp gerek yok beklemek için başka bir iş parçacığı için serbest. Bu nasıl olur:

public class DateFormatTest {

  private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>(){
    @Override
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyyMMdd");
    }
  };

  public Date convert(String source) throws ParseException{
    Date d = df.get().parse(source);
    return d;
  }
}

Burada daha detaylı bir iyi post.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Joe DiFeo

    Joe DiFeo

    7 AĞUSTOS 2012
  • RawBrahs

    RawBrahs

    28 Aralık 2010
  • ShotgunSandwichENT

    ShotgunSandw

    3 EKİM 2012