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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲国产在线视频中文字 | 精品国产91久久久久 | 久久热r在线视频精品 | 邪恶肉肉全彩色无遮盖 | 俄罗斯年轻男同gay69 | 日本无卡无吗中文免费 | 亚洲欧美天堂综合久久 | 2022国产在线观看 | 亚洲 日韩 国产 中文视频 | 天美传媒影视在线免费观看 | 女同学高中你下面好紧 | 免费网站看v片在线成人国产系列 | 亚洲精品123区在线观看 | 白丝超短裙被输出娇喘不停小说 | 男人天堂亚洲 | 亚洲精品在线免费观看视频 | 秘书在办公室疯狂被hd | 亚洲国产第一区二区香蕉日日 | 五月色婷婷网在线观看 | 亚洲男人天堂2023 | 亚洲剧情在线 | 日本红怡院亚洲红怡院最新 | 国产高清亚洲 | 男男羞羞视频网站国产 | 狐媚小说| 九九精品久久 | 日韩在线二区 | 高清一区二区 | 亚洲视频在线看 | 色婷婷激婷婷深爱五月老司机 | 欧美性一区二区三区 | 人与动人物人a级特片 | 免费在线观看日韩 | 国产性tv国产精品 | 国产精品视频久久 | 视频在线精品 | 国产综合图区 | 日本免费精品 | 欧美z0z0人禽交 | 欧美精品国产第一区二区 | 三极片在线观看 |