Java8中的lambda表达式是否执行多线程?

Mar*_*lte 5 java lambda multithreading java-8

在Java8中,引入了lambda表达式.这个问题是关于何时执行并行lambda.

在Java8之前,Callable -classes是一次执行多个线程的一种方法.可以将Callables与Executor -classes一起使用来执行.假设我使用固定线程池,使用3作为活动处理任务的数量.我们假设我有8个任务.固定线程池将启动前三个任务,并在完成后,启动下一个任务,直到完成所有8个任务.

如果我将我的任务实现为Java8-lambdas,会发生什么?全部8个会立刻开始吗?还是顺序?还是以任何聪明的方式?

特别是,它们是否与调用者在同一个线程中运行(不使用Exeuctor)?就其本质而言,我猜lambdas可以很容易地在另一个线程中执行.

JB *_*zet 11

Runnable r = () -> System.out.println("hello");
Run Code Online (Sandbox Code Playgroud)

相当于

Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("hello")
    }
};
Run Code Online (Sandbox Code Playgroud)

并且它不会改变runnable的执行方式.如果将runnable提交给线程池,则线程池将执行它,无论您使用什么创建runnable:lambda,匿名类或顶级类.最后,你定义的是Runnable的一个实例,这是唯一重要的事情.

  • @MarcusSchultö关于多线程的免费是什么,是并行流:`hugeList.parallelStream().map(s - > s.toUpperCase()).collect(toList())`例如会生成所有字符串大写,使用多个线程.但这与lambdas没有严格的联系.Lambdas只是创建新Stream API使用的函数,谓词,消费者等实例的一种很好的新方法. (7认同)
  • @MarcusSchultö您可以将lambdas视为语法糖,一种替代方案,用我们过去编写的大量开销替换代码,正如JBNizet在此处所示.它们的使用方式没有区别. (2认同)