我有一个线程执行器实现,其中包装器的成本非常高。有一个被定义如下的包装器类Task:
class Task {
public Runnable r;
public Task(Runnable r) {
this.r = r;
}
public void run() {
r.run();
}
List<task> taskList;
以下情况的运行时间为约800毫秒。
for (Task t : taskList) {
t.r.run();
}
对于下面的情况,时间大约为7000毫秒。
for (Task t : taskList) {
t.run();
}
这并不是孤立发生的,而是在执行器的代码内部发生的。我想知道有没有人能给出提示,可能会发生什么?
对于这个测试用例,传递的可运行对象如下:
class Tester implements Runnable {
int i;
public Tester(int i) {
this.i = i;
}
@Override
public void run() {
//System.out.println(i);
for (int j = 0; j < 1000000; j++) {
i = j;
}
}
public int getI() {
return i;
}
供参考,这段代码可以在github.com/sharvanath/TempThreadPool上找到。运行ThreadPoolTest以获取执行结果。现在尝试更改ThreadPool.java的第41行,看看魔术般的效果。