一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java多線程編程中使用DateFormat類

Java多線程編程中使用DateFormat類

2019-12-26 13:19goldensun JAVA教程

這篇文章主要介紹了Java多線程編程中使用DateFormat類,文中介紹了三種相關的并發使用方法,需要的朋友可以參考下

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

以下的代碼為我們展示了如何在一個線程環境里面使用DateFormat把字符串日期轉換為日期對象。創建一個實例來獲取日期格式會比較高效,因為系統不需要多次獲取本地語言和國家。
 

?
1
2
3
4
5
6
7
8
9
10
11
public class DateFormatTest {
 
 private final DateFormat format =
      new SimpleDateFormat("yyyyMMdd");
 
 public Date convert(String source)
           throws ParseException{
  Date d = format.parse(source);
  return d;
 }
}

這段代碼是非線程安全的。我們可以通過在多個線程中調用它。在以下調用的代碼中,我創建了一個有兩個線程的線程池,并提交了5個日期轉換任務,之后查看運行結果:
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
final DateFormatTest t =new DateFormatTest();
Callable<Date> task =new Callable<Date>(){
  public Date call()throws Exception {
    return t.convert("20100811");
  }
};
 
//讓我們嘗試2個線程的情況
ExecutorService exec = Executors.newFixedThreadPool(2);
List<Future<Date>> results =
       new ArrayList<Future<Date>>();
 
//實現5次日期轉換
for(int i =0; i <5; i++){
  results.add(exec.submit(task));
}
exec.shutdown();
 
//查看結果
for(Future<Date> result : results){
  System.out.println(result.get());
}

代碼的運行結果并非如我們所愿 - 有時候,它輸出正確的日期,有時候會輸出錯誤的(例如.Sat Jul 31 00:00:00 BST 2012),有些時候甚至會拋出NumberFormatException!


如何并發使用DateFormat類

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

1. 同步

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

?
1
2
3
4
5
6
7
public Date convert(String source)
          throws ParseException{
 synchronized(format) {
  Date d = format.parse(source);
  return d;
 }
}


2. 使用ThreadLocal

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 是一個很棒的開源的 JDK 的日期和日歷 API 的替代品,其 DateTimeFormat 是線程安全而且不變的。

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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();
 }
}

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女张开下身让男人桶 | 四虎www.| 国产精品久久久久久久久99热 | 九九99亚洲精品久久久久 | 久久亚洲成a人片 | 日本成人黄色片 | 亚洲国产欧美在线人成aaa | 九九精品成人免费国产片 | 国产成人精品1024在线 | 欧美特黄视频在线观看 | 北岛玲在线播放 | 天堂网www在线中文天堂 | 成人精品一区二区三区 | 99任你躁精品视频 | 日本xxx片免费高清在线 | 亚洲AV人无码综合在线观看蜜桃 | 色字当头 | 国产日韩欧美综合一区二区三区 | 欧美日韩亚洲成人 | 99精品久久99久久久久久 | 99热国产这里只有精品99 | 毛片小视频| 嫩草视频在线观看免费 | 欧美视频一区二区三区四区 | poren黑人 | 亚洲乱码一二三四五六区 | 男人的天堂视频在线 | 操闺蜜| 成人精品免费网站 | 精品无码久久久久久久动漫 | 禁忌4中文 | 免费观看日本视频 | 无码国产成人午夜在线观看不卡 | 欧美一区欧美二区 | 国产精品九九热 | 国产伦精一区二区三区视频 | 门房秦大爷在线阅读 | 99re免费在线视频 | 99精彩视频在线观看 | 俺来操| 视频二区 素人 欧美 日韩 |