关于java appengine中Threadocal中的使用

6 views
Skip to first unread message

何知翰

unread,
Feb 26, 2010, 5:36:57 AM2/26/10
to google-app-e...@googlegroups.com
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
330.gif

guangquanzhang

unread,
Feb 26, 2010, 5:54:09 AM2/26/10
to google-app-e...@googlegroups.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;
    }
}

麻烦各位了,谢谢

--
祝好
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
访问该论坛


--
Thanks

>> What I said is licenced under CC-by-nd :)

Email: java...@baturu.com
Blog: http://blog.baturu.com

杨浩

unread,
Feb 28, 2010, 8:21:42 PM2/28/10
to google-app-e...@googlegroups.com
具体不太清楚

可能性小的原因:我觉得是: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();
    }
}

guangquanzhang

unread,
Feb 28, 2010, 8:40:55 PM2/28/10
to google-app-e...@googlegroups.com
pm不可能是单例

杨浩 写道:
具体不太清楚

可能性小的原因:我觉得是: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
访问该论坛
Reply all
Reply to author
Forward
0 new messages