zoukankan      html  css  js  c++  java
  • Java8高中并发

    Java8中学并发

    本文翻译自:http://jaxenter.com/lean-concurrency-in-java-8-49924.html

    转载请注明出处:http://blog.csdn.net/kingviker/article/details/27057473

    有人以前说过(非常不幸,我们没有原话了):

    0基础程序猿觉得并发非常难。
    中级程序猿觉得并发非常easy。
    高级程序猿觉得并发非常难。

    这说的非常对。可是从好的方面来看,通过lambda表达式和非常多改进的API使编写并发代码更easy,Java8并发开发至少能得到改善。让我们来详细的看看(Java8的改进):

    Java8对JDK 1.0 API的改进。

    java.lang.Thread早在JDK 1.0版本号中就已经存在。在java8中被注解为功能性接口java.lang.Runnable也是。

    从如今起。差点儿不须要动大脑我们就能够提交Runnables给一个线程。让我们如果我们有一个非常耗时的操作:

    public static int longOperation() {
        System.out.println("Running on thread #"
        + Thread.currentThread().getId());
    
        // [...]
        return 42;
    }
    

    我们能够用多种方法把这个操作传递给线程,比如:

    Thread[] threads = {
    
        // Pass a lambda to a thread
        new Thread(() -> {
        longOperation();
        }),
    
        // Pass a method reference to a thread
        new Thread(ThreadGoodies::longOperation)
    };
    
    // Start all threads
    Arrays.stream(threads).forEach(Thread::start);
    
    // Join all threads
    Arrays.stream(threads).forEach(t -> {
        try { t.join(); }
        catch (InterruptedException ignore) {}
    });
    

    就像我们在之前的博文里提到的一样。lambda表达式没有一个简洁的方式来处理被检异常实在是一大憾事。在java.util.function包中新增的功能性接口没有一个涉及到抛出被检异常。把这项工作留给了调用端。

    在上一篇博文中。我们已经因此而公布了jOOλ(also jOOL,jOO-Lambda)包,该包包装了JDK中的每个功能性接口,据有同样功能并且也同意抛出被检异常。

    这在使用老的JDK API时特别实用,比如JDBC,或者上面提到的Thread API。使用jOOλ,我们能够这么写:

    // Join all threads
    Arrays.stream(threads).forEach(Unchecked.consumer(
        t -> t.join()
    ));
    

    Java8中改进的Java5 API

    Java的多线程在Java5的非常好的ExecutorService公布之前一直非常沉寂。管理多线程是一个负担,人们须要额外的库或者一个J2EE/JEE容器来管理线程池。

    这些用Java5来处理已经easy了非常多。我们如今能够提交一个Runnable对象或者一个Callable对象到ExcutorService。它管理自己的线程池。

    以下是一个我们怎样在Java8中利用这些Java5的并发API的样例:

    ExecutorService service = Executors
        .newFixedThreadPool(5);
    
    Future[] answers = {
        service.submit(() -> longOperation()),
        service.submit(ThreadGoodies::longOperation)
    };
    
    Arrays.stream(answers).forEach(Unchecked.consumer(
        f -> System.out.println(f.get())
    ));
    

    注意看。我们是怎样再次使用jOOλ中的UncheckedConsumer来包装在执行期调用get()方法抛出的被检异常。

    Java8中的并行和ForkJoinPool

    如今,Java8的Streams API在并发和并行方面有了非常大改进。 在Java8中你能够写出例如以下的代码:

    Arrays.stream(new int[]{ 1, 2, 3, 4, 5, 6 })
      .parallel()
      .max()
      .ifPresent(System.out::println);
    

    尽管在这个特殊的样例中不是非常必要,但看到只调用了parallel()就执行IntStream.max()来启用ForkJoinPool而你不必操心包括的ForkJoinTasks还是非常有趣的。这是非常实用的。由于不是每一个人都可以接受JDK7该复合物的引入JorkJoin API

  • 相关阅读:
    最易懂的语音自动增益原理介绍
    共振峰估计基础
    语音基音周期估计基础
    语音信号临界带宽的概念解释
    语音信号的时域维纳滤波器原理简介
    几种改进的谱减算法简介
    谱减算法的缺点和过减因子、谱下限的关系
    关于语音分帧时有重叠部分的原因分析
    x264命令参数与代码中变量的对应关系
    笔记--语音信号的预加重
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4726528.html
Copyright © 2011-2022 走看看