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

时间:2014-03-26 09:46:05

标签: java multithreading executorservice

我有n个资源和n个线程,每个线程都会使用一个资源来完成它的任务 创建线程时,我希望它接收资源并将其存储在本地线程变量中 线程完成后,我需要释放资源

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;
        }
});

1 个答案:

答案 0 :(得分:1)

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

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());
            }
        }
    };
  }
}

测试代码:

    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();