-1

私は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 ;
}
}

上記のメソッドを4つの異なるメソッドから呼び出す必要があります。上記のメソッドをさまざまなメソッドから呼び出すと、上記の合計コードが実行されます。私の要件は、メソッド全体を実行する必要があるのは1回だけです。そして、残りの3倍の合計メソッドは実行されないはずです。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

私が何をしているのかを提案してください。上記のメソッドは、4つのメソッドから呼び出されます。2つのメソッドはActionクラスに属し、2つのメソッドは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
}  }
4

3 に答える 3

2

ここではThreadLocalは適切ではないと思います。私はStruts2を使用したことがなく、Struts 1のみを使用しましたが、私が知る限り、これはサーブレットの上に構築されたWebフレームワークです。これらはWebコンテナ内で実行されており、スレッドをいつ開くかを決定するためにWebコンテナまで実行され、開発者はこの決定に干渉する必要があります。

現在、スレッドローカルはキー値のマップのみを提供するため、異なるスレッドで同じキーに対して異なる値を維持することが可能です。

たとえば、2つのスレッドAとBがあり、キーと値のペアを維持したい場合

  • "name"->'John' for thread A and
  • "name"->'スレッドBの'Fred'

あなたはスレッドローカルでそうすることができます。

あなたが本当に探しているのは一種のアプリケーションコンテキストです-コンテナ内のすべてのスレッドによって共有されるデータを保存する場所です。もう1つの可能性は、ここでのシングルトンです。

これはどの程度技術的に実装できますか?

あなたはこれこれを読むことに興味があるかもしれません

お役に立てれば

于 2012-09-20T05:13:58.513 に答える
1

以下のコードは役に立ちますか? Web サイトの記事を読み、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 が使用されています。

于 2012-09-20T05:45:47.550 に答える
0

私は自分のコーディングを間違えていません。変数を静的および最終として作成していません。

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

これで、スレッド ロケールの概念が機能します。

于 2012-09-21T05:17:27.920 に答える