import java.util.HashMap;
import java.util.Map;
/**
* 处理线程上的一些变量存储,减少参数的传递
*
*/
public class ThreadStore {
private static ThreadLocal tl = new ThreadLocal();
public static void set(String key, Object value) {
Map map = (Map) tl.get();
if (map == null) {
map = new HashMap();
}
map.put(key, value);
tl.set(map);
}
public static Object get(String key) {
Map map = (Map) tl.get();
if (map != null) {
return map.get(key);
}
return null;
}
}

hi,各位,打扰了。最近使用了Threadocal用来存储PersistenceManager,方便做事务,但是好像 Threadocal好像不太好使,数据永远都是第一次set进去的值(好像请求都用一个线程去处理,而不是每个线程对应一个请求),请问有什么解决办法 吗?抑或是我的代码有问题?附上源代码:
import java.util.HashMap;
import java.util.Map;
/**
* 处理线程上的一些变量存储,减少参数的传递
*
*/
public class ThreadStore {
private static ThreadLocal tl = new ThreadLocal();
public static void set(String key, Object value) {
Map map = (Map) tl.get();
if (map == null) {
map = new HashMap();
}
map.put(key, value);
tl.set(map);
}
public static Object get(String key) {
Map map = (Map) tl.get();
if (map != null) {
return map.get(key);
}
return null;
}
}
麻烦各位了,谢谢
--
祝好
Best regards
--
您收到此信息是由于您订阅了 Google 论坛“Google App Engine 中文开发组”论
坛。
要在此论坛发帖,请发电子邮件到 google-app-e...@googlegroups.com
要退订此论坛,请发邮件至
google-app-engine-...@googlegroups.com
更多选项,请通过
https://groups.google.com/group/google-app-engine-cn-dev?hl=zh-CN?hl=zh-CN
访问该论坛
>> What I said is licenced under CC-by-nd :) Email: java...@baturu.com Blog: http://blog.baturu.com
PersistenceManager pm = PMF.get().getPersistenceManager()出来的就是唯一的一个实例(难道是单例?)
所以就是同一个了
最可能的原因,你的请求频率太小导致目前只需要一个请求即可完成,所以一直都只有一个请求响应你的请求!(action中增加Thread.sleep(5000)再测试下)
感觉ThreadStore可能问题,探讨下 ^ ^
public class ThreadStore {
private static Map<String, ThreadLocal<?>> map = new TreeMap<String, ThreadLocal<?>>();
public static void set(String key, Object value) {
ThreadLocal<?> tl = map.get(key);
if (tl == null) {
synchronized(map) {//因为多线程可能同时需要访问同一个threadlocal
tl = new ThreadLocal<?>();
map.put(key, tl);
}
}
tl.set(map);
}
public static Object get(String key) {
ThreadLocal<?> tl = map.get(key);
return tl == null ? null : tl.get();
}
}
具体不太清楚
可能性小的原因:我觉得是:PersistenceManager本身
PersistenceManager pm = PMF.get().getPersistenceManager()出来的就是唯一的一个实例(难道是单例?) 所以就是同一个了 最可能的原因,你的请求频率太小导致目前只需要一个请求即可完成,所以一直都只有一个请求响应你的请求!(action中增加Thread.sleep(5000)再测试下) 感觉ThreadStore可能问题,探讨下 ^ ^ public class ThreadStore { private static Map<String, ThreadLocal<?>> map = new TreeMap<String, ThreadLocal<?>>(); public static void set(String key, Object value) { ThreadLocal<?> tl = map.get(key); if (tl == null) { synchronized(map) {//因为多线程可能同时需要访问同一个threadlocal tl = new ThreadLocal<?>(); map.put(key, tl); } } tl.set(map); } public static Object get(String key) { ThreadLocal<?> tl = map.get(key); return tl == null ? null : tl.get(); } }
在 2010年2月26日 下午6:54,guangquanzhang <guangqu...@gmail.com>写 道:
线程在appengine是受限的,ThreadLocal是不 是也受限?
何知翰 写道:
hi,各位,打扰了。最近使用了Threadocal用来存储 PersistenceManager,方便做事务,但是好像 Threadocal好像不太好使,数据永远都是第一次set进去的值(好像请求都用一个线程去处理,而不是每个线程对应一个请求),请问有什么解决办法 吗?抑或是我的代码有问题?附上源代码:
import java.util.HashMap;
import java.util.Map;
/**
* 处理线程上的一些变量存储,减少参数的传递
*
*/
public class ThreadStore {
private static ThreadLocal tl = new ThreadLocal();
public static void set(String key, Object value) {
Map map = (Map) tl.get();
if (map == null) {
map = new HashMap();
}
map.put(key, value);
tl.set(map);
}
public static Object get(String key) {
Map map = (Map) tl.get();
if (map != null) {
return map.get(key);
}
return null;
}
}
--
您收到此信息是由于您订阅了 Google 论坛“Google App Engine 中文开发组”论
坛。
要在此论坛发帖,请发电子邮件到 google-app-e...@googlegroups.com
要退订此论坛,请发邮件至
google-app-engine-...@googlegroups.com
更多选项,请通过
https://groups.google.com/group/google-app-engine-cn-dev?hl=zh-CN?hl=zh-CN
访问该论坛