我有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;
}
});
答案 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();