Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 传递参数以在scheduleWithFixedDelay中运行函数_Java_Multithreading_Executorservice - Fatal编程技术网

Java 传递参数以在scheduleWithFixedDelay中运行函数

Java 传递参数以在scheduleWithFixedDelay中运行函数,java,multithreading,executorservice,Java,Multithreading,Executorservice,使用executor.scheduleWithFixedDelay调用时,如何在run方法中传递函数 例如 那么,在这个例子中,我如何将参数传递给runOnce。例如,如果我想发送I?您希望this::runOnce基于I返回一个Runnable,因此如果您希望一个Runnable只需将I输出到控制台,则该类将如下所示: public class Blah { public void whatever() { ScheduledExecutorService sched

使用executor.scheduleWithFixedDelay调用时,如何在run方法中传递函数

例如


那么,在这个例子中,我如何将参数传递给runOnce。例如,如果我想发送I?

您希望
this::runOnce
基于
I
返回一个
Runnable
,因此如果您希望一个Runnable只需将
I
输出到控制台,则该类将如下所示:

public class Blah {

    public void whatever() {
        ScheduledExecutorService scheduledExecutorService =
            Executors.newScheduledThreadPool(5);
        IntStream.range(0, 4).forEach(i -> {
            scheduledExecutorService.scheduleWithFixedDelay(runOnce(i),
                0, 5000, TimeUnit.MILLISECONDS);
        });
    }

    private Runnable runOnce(int i) {
        return () -> System.out.println(i);
    }
}

无论
runOnce
返回什么,您都可以将方法引用更改为lambda,并将
i
作为参数传入:

IntStream.range(0, 4).forEach(i -> { 
    executor.scheduleWithFixedDelay(() -> runOnce(i), 0, 5000, TimeUnit.MILLISECONDS);
});

是的,很好用。()->runOnce(i)在做什么?@hatellla这是一个lambda,是
Runnable
的语法糖,它的
run
方法调用
runOnce
方法,并将
i
作为参数。如果我不想返回任何东西,我不能只返回System.out.println(i);而不是()->System.out.println(i);?
IntStream.range(0, 4).forEach(i -> { 
    executor.scheduleWithFixedDelay(() -> runOnce(i), 0, 5000, TimeUnit.MILLISECONDS);
});