私はキャッシュプロバイダとして使用されるクラスを作成しました。マップ、タイムスタンプ付きのマップエントリを使用し、たびにクリーンアップを実行するスレッドを生成します。このクラスは、Webアプリケーションで使用されます。このWebアプリケーションにはPOSTに30秒かかるという問題がありました。問題を解決してこの問題を解決しました。このスレッドコードのどこにエラーがありますか?
私はこのクラスのエラーを見つけるために最善を尽くしましたが、できません。ここで私を助けてください。 ユーザークラスは、ユーザーを説明するPOJOの一種です。
public class UserStore implements Thread.UncaughtExceptionHandler {
private static volatile UserStore instance;
private static Thread cleanUpThread;
private static Map<String, TimeStampedToken<User>> tokenMap = new HashMap<String, TimeStampedToken<User>>();
public static UserStore getInstance() {
if (instance == null) {
synchronized(UserStore.class) {
if (instance == null) {
instance = new UserStore();
cleanUpThread = new Thread(new CleanUpWorker());
cleanUpThread.setUncaughtExceptionHandler(instance);
cleanUpThread.start();
}
}
}
return instance;
}
public void uncaughtException(Thread thread, Throwable throwable) {
if (throwable instanceof ThreadDeath) {
cleanUpThread = new Thread(new CleanUpWorker());
cleanUpThread.setUncaughtExceptionHandler(this);
cleanUpThread.start();
throw (ThreadDeath)throwable;
}
}
private static class CleanUpWorker implements Runnable {
private static final long CLEANUP_CYCLE_MS = 300000;
private static final long OBJECT_LIVE_TIME = 299900;
public void run() {
long sleepRemaining;
long sleepStart = System.currentTimeMillis();
sleepRemaining = CLEANUP_CYCLE_MS;
while (true) {
try {
sleepStart = System.currentTimeMillis();
Thread.sleep(sleepRemaining);
cleanUp();
sleepRemaining = CLEANUP_CYCLE_MS;
} catch (InterruptedException e) {
sleepRemaining = System.currentTimeMillis() - sleepStart;
}
}
}
private void cleanUp() {
Long currentTime = System.currentTimeMillis();
synchronized(tokenMap) {
for (String user : tokenMap.keySet()) {
TimeStampedToken<User> tok = tokenMap.get(user);
if (tok.accessed + OBJECT_LIVE_TIME < currentTime) {
tokenMap.remove(user);
}
}
}
}
}
public void addToken(User tok) {
synchronized(tokenMap) {
tokenMap.put(tok.getUserId(), new TimeStampedToken<User>(tok));
}
}
public User getToken(String userId) {
synchronized(tokenMap) {
TimeStampedToken<User> user = tokenMap.get(userId);
if (user != null) {
user.accessed = System.currentTimeMillis();
return user.payload;
} else {
return null;
}
}
}
private static class TimeStampedToken<E> {
public TimeStampedToken(E payload) {
this.payload = payload;
}
public long accessed = System.currentTimeMillis();
public E payload;
}
}
問題はキャッシュクラスの機能とまったく同じですか?それは間違って(機能的に)動作しますか?または、あなたが望むよりも遅く動作します(POSTに時間がかかりすぎます)?もしそうなら、どのメソッド呼び出しに時間がかかりますか? – ArjunShankar
スレッドを停止するよう特に指示された場合にのみ、スレッドを再起動するのはなぜですか? –
有効期限のあるキャッシュを実装しようとしているようです。これを実装する方がはるかに簡単な方法がありますが、これを既に行っているライブラリを使用することもできます。 –