为什么在这个例子中方法引用没有启动线程?
package example;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ESMethodReference {
int i1, i2, result = 0;
ESMethodReference(int i1, int i2){
this.i1 =i1;
this.i2 = i2;
}
public Runnable calculate(){
System.out.print("In calculate()");
return new Runnable() {
@Override
public void run() {
result += i1 + i2;
System.out.print(" creating result");
}
};
}
public static void main(String[] args) throws InterruptedException{
ESMethodReference es = new ESMethodReference(1, 1);
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 0; i < 2; i++){
executorService.submit(es.calculate());
Thread.sleep(100); // Allow new thread to run
System.out.println("\tes.calculate() result incremented " + es.result );
executorService.submit(es::calculate);
Thread.sleep(100); // Allow new thread to run
System.out.println("\tes::calculate result NOT incremented " + es.result );
}
executorService.shutdown();
}
}
输出:
在calculate() 创建结果es.calculate() 结果增加2
在calculate() es::calculate 结果没有增加2
在calculate() 创建结果es.calculate() 结果增加4
在calculate() es::calculate 结果未增加4
最佳答案
因为那些是不同的东西 - 路过 es::calculate
与通过相同:
new Runnable() {
@Override
public void run() {
es.calculate();
}
}
显然,这与以下内容不同:
new Runnable() {
@Override
public void run() {
es.calculate().run();
}
}
关于Java 8 方法引用不启动线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44913562/