zoukankan      html  css  js  c++  java
  • java 多线程:线程安全问题,示例DateFormat多线程执行冲突解决方案ThreadLocal、方法内变量

    SimpleDateFormat多线程中执行报错

    • java.lang.NumberFormatException: For input string: ""  
      import java.text.DateFormat;
      import java.text.ParseException;
      import java.text.SimpleDateFormat;
      import java.util.*;
      
      /**
       * @ClassName VarNotSafeDateFormat
       * @projectName: object1
       * @author: Zhangmingda
       * @description: XXX
       * date: 2021/4/26.
       */
      public class VarNotSafeDateFormat {
          private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); //使用共享的共享对象可能报错
          private static class DateFormatTransfer extends Thread{
              private String dateStr;
      
              public DateFormatTransfer(String dateStr) {
                  this.dateStr = dateStr;
              }
      
              @Override
              public void run() {
      //            DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");  方法内变量安全,每个线程执行方法的时候独立创建实例
                  try {
                      Date date = DATE_FORMAT.parse(dateStr);
                      String stringDateAfterTrans = DATE_FORMAT.format(date);
                      System.out.println(dateStr + "转换后:" + stringDateAfterTrans);
                  } catch (ParseException e) {
                      e.printStackTrace();
                  }
              }
          }
      
          public static void main(String[] args) {
              List<String> dates = Arrays.asList("2021-04-21","2021-04-22","2021-04-23","2021-04-24","2021-04-25",
                      "2021-04-26","2021-04-27","2021-04-28","2021-04-29","2021-04-30");
              Set<Thread> threads = new HashSet<>();
              dates.forEach(dateStr ->{
      //            new DateFormatTransfer(dateStr).start();
                  threads.add(new DateFormatTransfer(dateStr));
              });
              threads.forEach(thread -> thread.start());
          }
      }

    ThreadLocal 变量 解决方案:

    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.*;
    
    /**
     * @ClassName VarNotSafeDateFormat
     * @projectName: object1
     * @author: Zhangmingda
     * @description: XXX
     * date: 2021/4/26.
     */
    public class VarNotSafeDateFormat {
    
        /**
         * ThreadLocal 线程安全变量,和方法变量异曲同工之妙,实际都创建了不同的子实例用
         */
        private static final ThreadLocal<DateFormat> DATE_FORMAT_THREAD_LOCAL = new ThreadLocal<>(){
            @Override
            protected DateFormat initialValue() {
                return new SimpleDateFormat("yyyy-MM-dd");
            }
        };
    
        private static class DateFormatTransfer extends Thread{
            private String dateStr;
    
            public DateFormatTransfer(String dateStr) {
                this.dateStr = dateStr;
            }
    
            @Override
            public void run() {
    //            DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");  方法内变量安全,每个线程执行方法的时候独立创建实例
                try {
                    Date date = DATE_FORMAT_THREAD_LOCAL.get().parse(dateStr);
                    String stringDateAfterTrans = DATE_FORMAT_THREAD_LOCAL.get().format(date);
                    System.out.println(dateStr + "转换后:" + stringDateAfterTrans);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args) {
            List<String> dates = Arrays.asList("2021-04-21","2021-04-22","2021-04-23","2021-04-24","2021-04-25",
                    "2021-04-26","2021-04-27","2021-04-28","2021-04-29","2021-04-30");
            Set<Thread> threads = new HashSet<>();
            dates.forEach(dateStr ->{
                threads.add(new DateFormatTransfer(dateStr));
            });
            threads.forEach(thread -> thread.start());
        }
    }

     

  • 相关阅读:
    Win10系统怎么彻底关闭Windows defender?
    用 winrar 解压 haozip 分卷压缩包的方法
    关闭WordPress自动保存和文章修订功能
    WordPress中Invalid argument supplied for foreach()错误原因及解决办法
    C#PDF转图片
    VS使用Nuget教程详解 Visual Studio 安装第三方的组件库
    kafka源码阅读环境搭建
    博客园主题美化
    官方文档
    [UGUI]UI特效裁剪
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/14704988.html
Copyright © 2011-2022 走看看