我正在使用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
} }
答案 0 :(得分:2)
我认为ThreadLocal不合适。我从来没有使用Struts 2,只使用struts 1,但据我所知,这是一个建立在servelts之上的Web框架。它们在web容器内运行,并且在web容器中运行,以决定何时打开线程,并且作为开发人员你应该干涉这个决定。
现在线程本地只提供键值映射,以便可以为不同线程中的相同键维护不同的值。
例如,如果您有两个线程A和B并且想要维护键值对
你可以用本地线程来完成。
您真正需要的是一种应用程序上下文 - 存储容器中所有线程共享数据的位置。另一种可能性是这里的单身人士。
技术上如何实施?
希望这有帮助
答案 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>();
现在线程区域设置概念将起作用。