gpt4 book ai didi

Java 8 方法引用不启动线程?

转载 作者:行者123 更新时间:2023-12-01 14:04:53 24 4
gpt4 key购买 nike

为什么在这个例子中方法引用没有启动线程?

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com