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

  • 相关阅读:
    线段树专辑—— pku 1436 Horizontally Visible Segments
    线段树专辑——pku 3667 Hotel
    线段树专辑——hdu 1540 Tunnel Warfare
    线段树专辑—— hdu 1828 Picture
    线段树专辑—— hdu 1542 Atlantis
    线段树专辑 —— pku 2482 Stars in Your Window
    线段树专辑 —— pku 3225 Help with Intervals
    线段树专辑—— hdu 1255 覆盖的面积
    线段树专辑—— hdu 3016 Man Down
    Ajax跨域访问
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4726528.html
Copyright © 2011-2022 走看看