如何使用ThreadLocal存储数据

时间:2012-09-20 05:00:50

标签: java multithreading struts2 thread-local

我正在使用Strust2和Hibernate。我必须找出货币汇率(USD到INR)。我需要在多个地方使用这些信息。为此,我正在使用 ThreadLocal 来实现此目的。

public class GetExchangeRate{
private ThreadLocal<Double> threadLocalRate = new ThreadLocal<Double>();
public double getCurrencyRate(UserDet userDet){
    LOG.info("Thread id is ---------------->"+Thread.currentThread().getId());
    Double currencyRate = (Double) threadLocalRate.get();
    if(currencyRate == null){
        LOG.info("Object does not exist");
     ---//my code which is used to find USD --> INR exchange rate
   threadLocalRate.set(currencyRate);    
}
return currencyRate ;
}
}

我需要从四个不同的方法调用上述方法。当我调用上面的方法时,从不同的方法,上面的总代码正在执行。 我的要求只有一次总方法必须执行。剩下三次总方法不应该执行。应返回存储在ThreadLocal对象中的值。

这是我的日志报告,其中显示了上述总方法的执行情况。

[ INFO] 2012-09-20 10:20:04,611 [CommonFormats] (CommonFormats.java:getCurrencyRate:159)
Thread id is ---------------------------->54
 [ INFO] 2012-09-20 10:20:04,611 [CommonFormats] (CommonFormats.java:getCurrencyRate:163)
Object does not exist

[ INFO] 2012-09-20 10:20:49,529 [CommonFormats] (CommonFormats.java:getCurrencyRate:159)
Thread id is ---------------------------->54
 [ INFO] 2012-09-20 10:20:49,529 [CommonFormats] (CommonFormats.java:getCurrencyRate:163)
Object does not exist

请说明我做错了什么。上述方法将从四个方法调用。 两种方法属于Action类,两种方法属于Service层类。

我的示例代码

 //Action class
    public class StrutsAction1{
public String method1(){  
       // my code
    CommonFormats commonFormats= new CommonFormats(); 
    System.out.println(commonFormats.getCurrencyRate());
       // my code
}
public String method2(){  
       // my code
    CommonFormats commonFormats= new CommonFormats(); 
    System.out.println(commonFormats.getCurrencyRate());
       // my code
}  }

//Business class
public class BussinessLogic{
 public String method1(){  

       // my code
    CommonFormats commonFormats= new CommonFormats(); 
    System.out.println(commonFormats.getCurrencyRate());
       // my code

}
public String method2(){  

       // my code
    CommonFormats commonFormats= new CommonFormats(); 
    System.out.println(commonFormats.getCurrencyRate());
       // my code
}  }

3 个答案:

答案 0 :(得分:2)

我认为ThreadLocal不合适。我从来没有使用Struts 2,只使用struts 1,但据我所知,这是一个建立在servelts之上的Web框架。它们在web容器内运行,并且在web容器中运行,以决定何时打开线程,并且作为开发人员你应该干涉这个决定。

现在线程本地只提供键值映射,以便可以为不同线程中的相同键维护不同的值。

例如,如果您有两个线程A和B并且想要维护键值对

  • “name” - &gt;线程A和
  • 的'John'
  • “name” - &gt; 'Fred'代表主题B

你可以用本地线程来完成。

您真正需要的是一种应用程序上下文 - 存储容器中所有线程共享数据的位置。另一种可能性是这里的单身人士。

技术上如何实施?

您可能有兴趣阅读thisthis

希望这有帮助

答案 1 :(得分:1)

以下代码对您有帮助吗?我在网站上阅读了一篇文章并修改了代码,使其在JDK7.0中免费编译。我使用的资源是

http://javapapers.com/core-java/threadlocal/

package com.javapapers;

import java.text.SimpleDateFormat;
import java.util.Date;

public class ThreadLocalExample {
  private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>() {

    protected SimpleDateFormat initialValue() {
      return new SimpleDateFormat("yyyyMMdd HHmm");
    }
  };

  public String formatIt(Date date) {
    return formatter.get().format(date);
  }

  public static void main(String[] args)
  {
      ThreadLocalExample example = new ThreadLocalExample();
      System.out.println(example.formatIt(new Date()));
  }
}

这里ThreadLocal用作静态变量。

答案 2 :(得分:0)

我没有弄错我的编码。我还没有把变量变成静态和最终变量。

private static final ThreadLocal<Double> threadLocalRate = new ThreadLocal<Double>();

现在线程区域设置概念将起作用。