最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多線程編程中使用DateFormat類

 更新時(shí)間:2015年07月12日 09:11:05   投稿:goldensun  
這篇文章主要介紹了Java多線程編程中使用DateFormat類,文中介紹了三種相關(guān)的并發(fā)使用方法,需要的朋友可以參考下

 DateFormat 類是一個(gè)非線程安全的類。javadocs 文檔里面提到"Date formats是不能同步的。 我們建議為每個(gè)線程創(chuàng)建獨(dú)立的日期格式。 如果多個(gè)線程同時(shí)訪問一個(gè)日期格式,這需要在外部加上同步代碼塊。"

以下的代碼為我們展示了如何在一個(gè)線程環(huán)境里面使用DateFormat把字符串日期轉(zhuǎn)換為日期對(duì)象。創(chuàng)建一個(gè)實(shí)例來獲取日期格式會(huì)比較高效,因?yàn)橄到y(tǒng)不需要多次獲取本地語言和國家。
 

public class DateFormatTest {
 
 private final DateFormat format =
      new SimpleDateFormat("yyyyMMdd");
 
 public Date convert(String source)
           throws ParseException{
  Date d = format.parse(source);
  return d;
 }
}

這段代碼是非線程安全的。我們可以通過在多個(gè)線程中調(diào)用它。在以下調(diào)用的代碼中,我創(chuàng)建了一個(gè)有兩個(gè)線程的線程池,并提交了5個(gè)日期轉(zhuǎn)換任務(wù),之后查看運(yùn)行結(jié)果:
 

final DateFormatTest t =new DateFormatTest();
Callable<Date> task =new Callable<Date>(){
  public Date call()throws Exception {
    return t.convert("20100811");
  }
};
 
//讓我們嘗試2個(gè)線程的情況
ExecutorService exec = Executors.newFixedThreadPool(2);
List<Future<Date>> results =
       new ArrayList<Future<Date>>();
 
//實(shí)現(xiàn)5次日期轉(zhuǎn)換
for(int i =0; i <5; i++){
  results.add(exec.submit(task));
}
exec.shutdown();
 
//查看結(jié)果
for(Future<Date> result : results){
  System.out.println(result.get());
}

代碼的運(yùn)行結(jié)果并非如我們所愿 - 有時(shí)候,它輸出正確的日期,有時(shí)候會(huì)輸出錯(cuò)誤的(例如.Sat Jul 31 00:00:00 BST 2012),有些時(shí)候甚至?xí)伋鯪umberFormatException!


如何并發(fā)使用DateFormat類

我們可以有多種方法在線程安全的情況下使用DateFormat類。

1. 同步

最簡單的方法就是在做日期轉(zhuǎn)換之前,為DateFormat對(duì)象加鎖。這種方法使得一次只能讓一個(gè)線程訪問DateFormat對(duì)象,而其他線程只能等待。
 

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


2. 使用ThreadLocal

另外一個(gè)方法就是使用ThreadLocal變量去容納DateFormat對(duì)象,也就是說每個(gè)線程都有一個(gè)屬于自己的副本,并無需等待其他線程去釋放它。這種方法會(huì)比使用同步塊更高效。
 

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;
 }
}

3. Joda-Time

Joda-Time 是一個(gè)很棒的開源的 JDK 的日期和日歷 API 的替代品,其 DateTimeFormat 是線程安全而且不變的。

 

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.util.Date;
 
public class DateFormatTest {
 
 private final DateTimeFormatter fmt =
    DateTimeFormat.forPattern("yyyyMMdd");
 
 public Date convert(String source){
  DateTime d = fmt.parseDateTime(source);
  returnd.toDate();
 }
}


相關(guān)文章

  • Java中Arrays數(shù)組工具類的基本使用詳解

    Java中Arrays數(shù)組工具類的基本使用詳解

    Arrays類中的方法都是static修飾的靜態(tài)方法,在使用的時(shí)候可以直接使用類名進(jìn)行調(diào)用,而"不用"使用對(duì)象來調(diào)用(注意:是"不用"?而不是?"不能"),這篇文章主要給大家介紹了關(guān)于Java中Arrays數(shù)組工具類的基本使用,需要的朋友可以參考下
    2021-12-12
  • SpringMVC攔截器——實(shí)現(xiàn)登錄驗(yàn)證攔截器的示例代碼

    SpringMVC攔截器——實(shí)現(xiàn)登錄驗(yàn)證攔截器的示例代碼

    本篇文章主要介紹了SpringMVC攔截器——實(shí)現(xiàn)登錄驗(yàn)證攔截器的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • Java-URLDecoder、URLEncoder使用及說明

    Java-URLDecoder、URLEncoder使用及說明

    本文介紹了Java中URLDecoder和URLEncoder類的使用方法,包括編碼和解碼規(guī)則、推薦的編碼方案、解碼器處理非法字符的方法以及URL編碼和解碼的示例
    2024-12-12
  • Java獲取中文拼音、中文首字母縮寫和中文首字母的示例

    Java獲取中文拼音、中文首字母縮寫和中文首字母的示例

    本文主要介紹了Java獲取中文拼音、中文首字母縮寫和中文首字母,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-10-10
  • java、python、JavaScript以及jquery循環(huán)語句的區(qū)別

    java、python、JavaScript以及jquery循環(huán)語句的區(qū)別

    本篇文章主要介紹java、python、JavaScript以及jquery的循環(huán)語句的區(qū)別,這里整理了它們循環(huán)語句語法跟示例,以便大家閱讀,更好的區(qū)分它們的不同
    2016-07-07
  • springboot打包不同環(huán)境配置以及shell腳本部署的方法

    springboot打包不同環(huán)境配置以及shell腳本部署的方法

    這篇文章主要給大家介紹了關(guān)于springboot打包不同環(huán)境配置以及shell腳本部署的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用springboot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java實(shí)現(xiàn)將Object轉(zhuǎn)換成指定Class對(duì)象的操作代碼

    Java實(shí)現(xiàn)將Object轉(zhuǎn)換成指定Class對(duì)象的操作代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)將Object轉(zhuǎn)換成指定Class對(duì)象的操作,在Java中,將Object轉(zhuǎn)換為指定類型的Class對(duì)象實(shí)際上是兩個(gè)不同概念的操作,由于你提到的“將Object轉(zhuǎn)換成指定Class對(duì)象”可能有些混淆,我將分別展示這兩種操作的示例代碼,需要的朋友可以參考下
    2024-09-09
  • Springmvc應(yīng)用Mongodb分頁實(shí)現(xiàn)

    Springmvc應(yīng)用Mongodb分頁實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了Springmvc應(yīng)用Mongodb分頁實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • C語言實(shí)現(xiàn)矩陣運(yùn)算案例詳解

    C語言實(shí)現(xiàn)矩陣運(yùn)算案例詳解

    這篇文章主要介紹了C語言實(shí)現(xiàn)矩陣運(yùn)算案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • SpringBoot中的數(shù)據(jù)脫敏處理詳解

    SpringBoot中的數(shù)據(jù)脫敏處理詳解

    本文介紹了在SpringBoot中進(jìn)行數(shù)據(jù)脫敏處理的方法,通過自定義注解和Jackson配置,可以輕松實(shí)現(xiàn)對(duì)敏感數(shù)據(jù)的脫敏,保護(hù)用戶隱私
    2025-03-03

最新評(píng)論

洪江市| 信阳市| 镇赉县| 微博| 金湖县| 洛隆县| 福贡县| 上饶市| 华宁县| 禄丰县| 望都县| 平遥县| 北票市| 政和县| 上犹县| 永登县| 秦皇岛市| 噶尔县| 元氏县| 鹰潭市| 图们市| 诸暨市| 新巴尔虎右旗| 旅游| 包头市| 彝良县| 安远县| 达拉特旗| 英吉沙县| 大邑县| 天台县| 泸水县| 环江| 枣庄市| 三河市| 申扎县| 新龙县| 苏尼特左旗| 比如县| 江华| 寻乌县|