首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在ThreadFactory中初始化ThreadLocal变量?

如何在ThreadFactory中初始化ThreadLocal变量?
EN

Stack Overflow用户
提问于 2014-03-26 17:46:05
回答 1查看 1K关注 0票数 0

我有n个资源和n个线程,每个线程将使用一个资源来完成它的任务。

当线程被创建时,我希望它接收一个资源并存储它的本地线程变量。

线程完成后,我需要释放资源。

代码语言:javascript
复制
ExecutorService pool = Executors.newFixedThreadPool(10, new ThreadFactory() {
        public Thread newThread(final Runnable r) {
            Thread thread = new Thread(new Runnable() {
                public void run() {
                         //set ThreadLocal with a resource
                         //run   
                         //close the resource 
                }
            });
                return thread;
        }
});
EN

回答 1

Stack Overflow用户

发布于 2014-03-26 18:57:35

根据需要重写getResource()和releaseResource()。

代码语言:javascript
复制
class MyThreadFactory implements ThreadFactory {
      // String is the type of resource; change it if nesessary
  static final ThreadLocal<String> currentResourceKey = new ThreadLocal<String>();

  int n = 0;

  String getResource() {
    n++;
    System.out.println("aquired:" + n);
    return Integer.valueOf(n).toString();
  }

  void releaseResource(String res) {
    System.out.println("released:" + res);
  }

  @Override
  public Thread newThread(Runnable r) {
    return new Thread(r) {
        public void run() {
            currentResourceKey.set(getResource());
            try {
                super.run();
            } finally {
                releaseResource(currentResourceKey.get());
            }
        }
    };
  }
}

测试代码:

代码语言:javascript
复制
    ExecutorService pool = Executors.newFixedThreadPool(2,new MyThreadFactory());
    for (int k = 0; k < 5; k++) {
        pool.submit(new Runnable() {
            public void run() {
                String res = currentResourceKey.get();
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("  executed:"+res+" on "+Thread.currentThread().getName());
            }
        });
    }
    pool.shutdown();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22657019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档