JAVA8 CompletableFuture 简单并行调用处理方法实现

CompletableFuture实现了CompletionStage接口和Future接口,集成了异步回调、流式处理、多个Future组合处理的能力,

使Java在处理多任务的协同工作时更加方便简洁

一、自定义线程池

package com.atguigu.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * Description: 线程池测试
 *
 * @Author: zhx & moon hongxu_1234@163.com
 * @Date: 2021-04-22 0:17
 * @version: V1.0.0
 */
@Configuration
public class ThreadPoolConfig {

    @Bean(name = "zhxExecutors")
    public Executor getAsyncThread() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        //线程池维护线程的最少数量,核心线程数
        taskExecutor.setCorePoolSize(5);
        //线程池维护线程的最大数量,只有在缓冲队列满了之后才会申请超过核心线程数的线程
        taskExecutor.setMaxPoolSize(10);
        //缓存队列
        taskExecutor.setQueueCapacity(20);
        //允许的空闲时间,当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
        taskExecutor.setKeepAliveSeconds(200);
        //线程名称前缀
        taskExecutor.setThreadNamePrefix("zhx-moon-thread-");
        // 线程池对拒绝任务(无线程可用)的处理策略,目前只支持AbortPolicy、CallerRunsPolicy;默认为后者
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 调度器shutdown被调用时等待当前被调度的任务完成
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        // 等待时长
        taskExecutor.setAwaitTerminationSeconds(60);
        taskExecutor.initialize();
        return taskExecutor;
    }

}

二、自定义测试方法

package com.atguigu.util;

import lombok.extern.slf4j.Slf4j;

/**
 * Description: 子线程方法耗时测试
 *
 * @Author: zhx & moon hongxu_1234@163.com
 * @Date: 2021-06-21 14:00
 * @version: V1.0.0
 */
@Slf4j
public class TimeConsumingUtil {

    private int num = 0;

    public TimeConsumingUtil(int num){
        this.num = num;
    }

    public int square(){
        long start = System.currentTimeMillis();
        try {
            Thread.sleep(1000);
        }catch (Exception e){

        }
        log.info("线程:{} , 耗时 {} ms",Thread.currentThread().getName(),(System.currentTimeMillis()-start));
        return num*num;
    }

}

三、自定义接口类测试

1.异步任务批量提交测试:Future.submit

@GetMapping("/submit")
    public void submit() throws ExecutionException, InterruptedException {
        List<Integer> list = Arrays.asList(new Integer[]{1,4,9,16});
        ThreadPoolTaskExecutor threadPoolTaskExecutor = (ThreadPoolTaskExecutor)zhxExecutors;
        List<Integer> result = new ArrayList<>();
        List<Future<Integer>> futureList = new ArrayList<>();
        long start = System.currentTimeMillis();
        for (Integer i:list){
            TimeConsumingUtil timeConsumingUtil = new TimeConsumingUtil(i);
            futureList.add(threadPoolTaskExecutor.submit(timeConsumingUtil::square));
        }
        for (Future<Integer> future:futureList){
            result.add(future.get());
        }
        log.info("处理总耗时 {} , 结果:{}",(System.currentTimeMillis()-start),result);
    }

执行结果

请求接口:http://127.0.0.1:8887/submit


  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.7.RELEASE)

2021-06-22 16:14:07.254  INFO 12584 --- [           main] com.atguigu.HellowWorldMainApplication   : Starting HellowWorldMainApplication on zhx_yue with PID 12584 (C:\Users\Administrator\IdeaProjects\spring-boot-01-helloworld\target\classes started by Administrator in C:\Users\Administrator\IdeaProjects\spring-boot-01-helloworld)
2021-06-22 16:14:07.256  INFO 12584 --- [           main] com.atguigu.HellowWorldMainApplication   : No active profile set, falling back to default profiles: default
2021-06-22 16:14:07.863  INFO 12584 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8887 (http)
2021-06-22 16:14:07.875  INFO 12584 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-06-22 16:14:07.875  INFO 12584 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.22]
2021-06-22 16:14:07.939  INFO 12584 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-06-22 16:14:07.939  INFO 12584 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 658 ms
2021-06-22 16:14:08.133  INFO 12584 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService
2021-06-22 16:14:08.134  INFO 12584 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'zhxExecutors'
2021-06-22 16:14:08.371  INFO 12584 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8887 (http) with context path ''
2021-06-22 16:14:08.373  INFO 12584 --- [           main] com.atguigu.HellowWorldMainApplication   : Started HellowWorldMainApplication in 1.341 seconds (JVM running for 1.824)
2021-06-22 16:14:28.252  INFO 12584 --- [nio-8887-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-06-22 16:14:28.252  INFO 12584 --- [nio-8887-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-06-22 16:14:28.255  INFO 12584 --- [nio-8887-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 3 ms
2021-06-22 16:14:29.282  INFO 12584 --- [x-moon-thread-1] com.atguigu.util.TimeConsumingUtil       : 线程:zhx-moon-thread-1 , 耗时 1014 ms
2021-06-22 16:14:29.282  INFO 12584 --- [x-moon-thread-4] com.atguigu.util.TimeConsumingUtil       : 线程:zhx-moon-thread-4 , 耗时 1014 ms
2021-06-22 16:14:29.282  INFO 12584 --- [x-moon-thread-3] com.atguigu.util.TimeConsumingUtil       : 线程:zhx-moon-thread-3 , 耗时 1014 ms
2021-06-22 16:14:29.282  INFO 12584 --- [x-moon-thread-2] com.atguigu.util.TimeConsumingUtil       : 线程:zhx-moon-thread-2 , 耗时 1014 ms
2021-06-22 16:14:29.286  INFO 12584 --- [nio-8887-exec-1] com.atguigu.controller.HelloController   : 处理总耗时 1019 , 结果:[1, 16, 81, 256]

2.并行流处理

package com.atguigu.controller;

import com.alibaba.druid.pool.DruidDataSource;
import com.atguigu.config.DynamicDataSource;
import com.atguigu.entity.UserEntity;
import com.atguigu.mapper.UserMapper;
import com.atguigu.util.TimeConsumingUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.stream.Collectors;

/**
 * @author Administrator
 */
@RestController
@Slf4j
public class HelloController {

    @Autowired
    Executor zhxExecutors;

    @GetMapping("/timeConsumingUtil")
    public void timeConsumingUtil(int type){

        long start = System.currentTimeMillis();
        List<Integer> list = Arrays.asList(new Integer[]{1,4,9,16});
        List<Integer> result;
        if(type==0){
            //并行
            result = simpleParallel(list);
        }else{
            //串行
            result = simpleSerial(list);
        }
        log.info("处理总耗时 {} , 结果:{}",(System.currentTimeMillis()-start),result);
    }

    /**
     * 简单Java并行代码
     * @param list
     */
    public List<Integer> simpleParallel(List<Integer> list){
        List<CompletableFuture<Integer>> futures = new ArrayList<>();
        for(Integer i:list){
            TimeConsumingUtil timeConsumingUtil = new TimeConsumingUtil(i);
            futures.add(CompletableFuture.supplyAsync(()-> timeConsumingUtil.square(),zhxExecutors));
        }
        // 使用allOf方法来表示所有的并行任务
        CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));
        // 下面的方法可以帮助我们获得所有子任务的处理结果
        CompletableFuture<List<Integer>> finalResults = allFutures.thenApply(v ->
                futures.stream().map(CompletableFuture::join).collect(Collectors.toList())
        );
        return finalResults.join();
    }

    /**
     * 简单Java串行代码
     * @param list
     * @return
     */
    public List<Integer> simpleSerial(List<Integer> list){
        List<Integer> lists = new ArrayList<>();
        for (Integer i:list){
            TimeConsumingUtil timeConsumingUtil = new TimeConsumingUtil(i);
            lists.add(timeConsumingUtil.square());
        }
        return lists;
    }
}

四、测试结果

请求接口:http://127.0.0.1:8887/timeConsumingUtil?type=0

执行结果如下:并行四个线程同步进行方法处理,串行是依次进行处理方法的调用;并行处理效率高于串行

"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50346,suspend=y,server=n -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -javaagent:C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2020.2\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;C:\Users\Administrator\IdeaProjects\spring-boot-01-helloworld\target\classes;D:\apache-maven-space\org\springframework\boot\spring-boot-starter-tomcat\2.1.7.RELEASE\spring-boot-starter-tomcat-2.1.7.RELEASE.jar;D:\apache-maven-space\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;D:\apache-maven-space\org\apache\tomcat\embed\tomcat-embed-core\9.0.22\tomcat-embed-core-9.0.22.jar;D:\apache-maven-space\org\apache\tomcat\embed\tomcat-embed-el\9.0.22\tomcat-embed-el-9.0.22.jar;D:\apache-maven-space\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.22\tomcat-embed-websocket-9.0.22.jar;D:\apache-maven-space\org\springframework\boot\spring-boot-starter-web\2.1.7.RELEASE\spring-boot-starter-web-2.1.7.RELEASE.jar;D:\apache-maven-space\org\springframework\boot\spring-boot-starter\2.1.7.RELEASE\spring-boot-starter-2.1.7.RELEASE.jar;D:\apache-maven-space\org\springframework\boot\spring-boot\2.1.7.RELEASE\spring-boot-2.1.7.RELEASE.jar;D:\apache-maven-space\org\springframework\boot\spring-boot-autoconfigure\2.1.7.RELEASE\spring-boot-autoconfigure-2.1.7.RELEASE.jar;D:\apache-maven-space\org\springframework\boot\spring-boot-starter-logging\2.1.7.RELEASE\spring-boot-starter-logging-2.1.7.RELEASE.jar;D:\apache-maven-space\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\apache-maven-space\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\apache-maven-space\org\apache\logging\log4j\log4j-to-slf4j\2.11.2\log4j-to-slf4j-2.11.2.jar;D:\apache-maven-space\org\apache\logging\log4j\log4j-api\2.11.2\log4j-api-2.11.2.jar;D:\apache-maven-space\org\slf4j\jul-to-slf4j\1.7.26\jul-to-slf4j-1.7.26.jar;D:\apache-maven-space\org\springframework\spring-core\5.1.9.RELEASE\spring-core-5.1.9.RELEASE.jar;D:\apache-maven-space\org\springframework\spring-jcl\5.1.9.RELEASE\spring-jcl-5.1.9.RELEASE.jar;D:\apache-maven-space\org\yaml\snakeyaml\1.23\snakeyaml-1.23.jar;D:\apache-maven-space\org\springframework\boot\spring-boot-starter-json\2.1.7.RELEASE\spring-boot-starter-json-2.1.7.RELEASE.jar;D:\apache-maven-space\com\fasterxml\jackson\core\jackson-databind\2.9.9\jackson-databind-2.9.9.jar;D:\apache-maven-space\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;D:\apache-maven-space\com\fasterxml\jackson\core\jackson-core\2.9.9\jackson-core-2.9.9.jar;D:\apache-maven-space\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.9\jackson-datatype-jdk8-2.9.9.jar;D:\apache-maven-space\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.9\jackson-datatype-jsr310-2.9.9.jar;D:\apache-maven-space\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.9\jackson-module-parameter-names-2.9.9.jar;D:\apache-maven-space\org\hibernate\validator\hibernate-validator\6.0.17.Final\hibernate-validator-6.0.17.Final.jar;D:\apache-maven-space\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;D:\apache-maven-space\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;D:\apache-maven-space\com\fasterxml\classmate\1.4.0\classmate-1.4.0.jar;D:\apache-maven-space\org\springframework\spring-web\5.1.9.RELEASE\spring-web-5.1.9.RELEASE.jar;D:\apache-maven-space\org\springframework\spring-beans\5.1.9.RELEASE\spring-beans-5.1.9.RELEASE.jar;D:\apache-maven-space\org\springframework\spring-webmvc\5.1.9.RELEASE\spring-webmvc-5.1.9.RELEASE.jar;D:\apache-maven-space\org\springframework\spring-aop\5.1.9.RELEASE\spring-aop-5.1.9.RELEASE.jar;D:\apache-maven-space\org\springframework\spring-context\5.1.9.RELEASE\spring-context-5.1.9.RELEASE.jar;D:\apache-maven-space\org\springframework\spring-expression\5.1.9.RELEASE\spring-expression-5.1.9.RELEASE.jar;D:\apache-maven-space\org\bytedeco\javacv\1.5.4\javacv-1.5.4.jar;D:\apache-maven-space\org\bytedeco\javacpp\1.5.4\javacpp-1.5.4.jar;D:\apache-maven-space\org\bytedeco\openblas\0.3.10-1.5.4\openblas-0.3.10-1.5.4.jar;D:\apache-maven-space\org\bytedeco\opencv\4.4.0-1.5.4\opencv-4.4.0-1.5.4.jar;D:\apache-maven-space\org\bytedeco\ffmpeg\4.3.1-1.5.4\ffmpeg-4.3.1-1.5.4.jar;D:\apache-maven-space\org\bytedeco\flycapture\2.13.3.31-1.5.4\flycapture-2.13.3.31-1.5.4.jar;D:\apache-maven-space\org\bytedeco\libdc1394\2.2.6-1.5.4\libdc1394-2.2.6-1.5.4.jar;D:\apache-maven-space\org\bytedeco\libfreenect\0.5.7-1.5.4\libfreenect-0.5.7-1.5.4.jar;D:\apache-maven-space\org\bytedeco\libfreenect2\0.2.0-1.5.4\libfreenect2-0.2.0-1.5.4.jar;D:\apache-maven-space\org\bytedeco\librealsense\1.12.4-1.5.4\librealsense-1.12.4-1.5.4.jar;D:\apache-maven-space\org\bytedeco\librealsense2\2.29.0-1.5.4\librealsense2-2.29.0-1.5.4.jar;D:\apache-maven-space\org\bytedeco\videoinput\0.200-1.5.4\videoinput-0.200-1.5.4.jar;D:\apache-maven-space\org\bytedeco\artoolkitplus\2.3.1-1.5.4\artoolkitplus-2.3.1-1.5.4.jar;D:\apache-maven-space\org\bytedeco\flandmark\1.07-1.5.4\flandmark-1.07-1.5.4.jar;D:\apache-maven-space\org\bytedeco\leptonica\1.80.0-1.5.4\leptonica-1.80.0-1.5.4.jar;D:\apache-maven-space\org\bytedeco\tesseract\4.1.1-1.5.4\tesseract-4.1.1-1.5.4.jar;D:\apache-maven-space\org\openjfx\javafx-graphics\11\javafx-graphics-11.jar;D:\apache-maven-space\org\openjfx\javafx-graphics\11\javafx-graphics-11-win.jar;D:\apache-maven-space\org\openjfx\javafx-base\11\javafx-base-11.jar;D:\apache-maven-space\org\openjfx\javafx-base\11\javafx-base-11-win.jar;D:\apache-maven-space\org\projectlombok\lombok\1.18.8\lombok-1.18.8.jar;D:\apache-maven-space\org\mybatis\spring\boot\mybatis-spring-boot-starter\2.1.1\mybatis-spring-boot-starter-2.1.1.jar;D:\apache-maven-space\org\springframework\boot\spring-boot-starter-jdbc\2.1.7.RELEASE\spring-boot-starter-jdbc-2.1.7.RELEASE.jar;D:\apache-maven-space\com\zaxxer\HikariCP\3.2.0\HikariCP-3.2.0.jar;D:\apache-maven-space\org\slf4j\slf4j-api\1.7.26\slf4j-api-1.7.26.jar;D:\apache-maven-space\org\springframework\spring-jdbc\5.1.9.RELEASE\spring-jdbc-5.1.9.RELEASE.jar;D:\apache-maven-space\org\springframework\spring-tx\5.1.9.RELEASE\spring-tx-5.1.9.RELEASE.jar;D:\apache-maven-space\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\2.1.1\mybatis-spring-boot-autoconfigure-2.1.1.jar;D:\apache-maven-space\org\mybatis\mybatis\3.5.3\mybatis-3.5.3.jar;D:\apache-maven-space\org\mybatis\mybatis-spring\2.0.3\mybatis-spring-2.0.3.jar;D:\apache-maven-space\com\github\pagehelper\pagehelper\5.1.2\pagehelper-5.1.2.jar;D:\apache-maven-space\com\github\jsqlparser\jsqlparser\1.0\jsqlparser-1.0.jar;D:\apache-maven-space\org\postgresql\postgresql\42.2.6\postgresql-42.2.6.jar;D:\apache-maven-space\com\alibaba\druid\1.1.16\druid-1.1.16.jar;D:\apache-maven-space\org\springframework\boot\spring-boot-configuration-processor\2.1.7.RELEASE\spring-boot-configuration-processor-2.1.7.RELEASE.jar;D:\apache-maven-space\com\alibaba\fastjson\1.2.70\fastjson-1.2.70.jar;D:\Program Files\JetBrains\IntelliJ IDEA 2020.2.3\lib\idea_rt.jar" com.atguigu.HellowWorldMainApplication
Connected to the target VM, address: '127.0.0.1:50346', transport: 'socket'

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.7.RELEASE)

2021-06-21 15:44:36.507  INFO 2584 --- [           main] com.atguigu.HellowWorldMainApplication   : Starting HellowWorldMainApplication on zhx_yue with PID 2584 (C:\Users\Administrator\IdeaProjects\spring-boot-01-helloworld\target\classes started by Administrator in C:\Users\Administrator\IdeaProjects\spring-boot-01-helloworld)
2021-06-21 15:44:36.509  INFO 2584 --- [           main] com.atguigu.HellowWorldMainApplication   : No active profile set, falling back to default profiles: default
2021-06-21 15:44:37.143  INFO 2584 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8887 (http)
2021-06-21 15:44:37.155  INFO 2584 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-06-21 15:44:37.155  INFO 2584 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.22]
2021-06-21 15:44:37.211  INFO 2584 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-06-21 15:44:37.211  INFO 2584 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 677 ms
2021-06-21 15:44:37.404  INFO 2584 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService
2021-06-21 15:44:37.405  INFO 2584 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'zhxExecutors'
2021-06-21 15:44:37.640  INFO 2584 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8887 (http) with context path ''
2021-06-21 15:44:37.642  INFO 2584 --- [           main] com.atguigu.HellowWorldMainApplication   : Started HellowWorldMainApplication in 1.391 seconds (JVM running for 2.102)
2021-06-21 15:45:02.525  INFO 2584 --- [nio-8887-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-06-21 15:45:02.525  INFO 2584 --- [nio-8887-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-06-21 15:45:02.529  INFO 2584 --- [nio-8887-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 4 ms
2021-06-21 15:45:03.571  INFO 2584 --- [x-moon-thread-3] com.atguigu.util.TimeConsumingUtil       : 线程:zhx-moon-thread-3 , 耗时 1001 ms
2021-06-21 15:45:03.571  INFO 2584 --- [x-moon-thread-4] com.atguigu.util.TimeConsumingUtil       : 线程:zhx-moon-thread-4 , 耗时 1001 ms
2021-06-21 15:45:03.571  INFO 2584 --- [x-moon-thread-2] com.atguigu.util.TimeConsumingUtil       : 线程:zhx-moon-thread-2 , 耗时 1001 ms
2021-06-21 15:45:03.571  INFO 2584 --- [x-moon-thread-1] com.atguigu.util.TimeConsumingUtil       : 线程:zhx-moon-thread-1 , 耗时 1001 ms
2021-06-21 15:45:03.572  INFO 2584 --- [nio-8887-exec-1] com.atguigu.controller.HelloController   : 处理总耗时 1004 , 结果:[1, 16, 81, 256]
2021-06-21 15:45:18.714  INFO 2584 --- [nio-8887-exec-2] com.atguigu.util.TimeConsumingUtil       : 线程:http-nio-8887-exec-2 , 耗时 1011 ms
2021-06-21 15:45:19.718  INFO 2584 --- [nio-8887-exec-2] com.atguigu.util.TimeConsumingUtil       : 线程:http-nio-8887-exec-2 , 耗时 1004 ms
2021-06-21 15:45:20.729  INFO 2584 --- [nio-8887-exec-2] com.atguigu.util.TimeConsumingUtil       : 线程:http-nio-8887-exec-2 , 耗时 1011 ms
2021-06-21 15:45:21.733  INFO 2584 --- [nio-8887-exec-2] com.atguigu.util.TimeConsumingUtil       : 线程:http-nio-8887-exec-2 , 耗时 1004 ms
2021-06-21 15:45:21.733  INFO 2584 --- [nio-8887-exec-2] com.atguigu.controller.HelloController   : 处理总耗时 4030 , 结果:[1, 16, 81, 256]
2021-06-21 15:49:12.419  INFO 2584 --- [nio-8887-exec-4] com.atguigu.util.TimeConsumingUtil       : 线程:http-nio-8887-exec-4 , 耗时 1011 ms
2021-06-21 15:49:13.425  INFO 2584 --- [nio-8887-exec-4] com.atguigu.util.TimeConsumingUtil       : 线程:http-nio-8887-exec-4 , 耗时 1006 ms
2021-06-21 15:49:14.433  INFO 2584 --- [nio-8887-exec-4] com.atguigu.util.TimeConsumingUtil       : 线程:http-nio-8887-exec-4 , 耗时 1008 ms
2021-06-21 15:49:15.438  INFO 2584 --- [nio-8887-exec-4] com.atguigu.util.TimeConsumingUtil       : 线程:http-nio-8887-exec-4 , 耗时 1005 ms
2021-06-21 15:49:15.438  INFO 2584 --- [nio-8887-exec-4] com.atguigu.controller.HelloController   : 处理总耗时 4030 , 结果:[1, 16, 81, 256]

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Java 8 提供了一系列的工具和 API 来帮助我们进行多任务并行处理。其中最常用的是 `java.util.concurrent` 包中的类,比如 `Executor`、`ExecutorService`、`ThreadPoolExecutor` 等。 举个例子,我们可以使用 `ExecutorService` 来创建一个线程池,然后将多个任务封装成 `Callable` 或 `Runnable` 接口的实现类,然后使用 `ExecutorService.submit()` 方法将任务提交到线程池中进行执行: ```java ExecutorService executorService = Executors.newFixedThreadPool(4); Future<String> result1 = executorService.submit(() -> "Task 1"); Future<String> result2 = executorService.submit(() -> "Task 2"); String result = result1.get() + " " + result2.get(); System.out.println(result); executorService.shutdown(); ``` 在这个例子中,我们创建了一个可以同时执行 4 个任务的线程池,然后提交了两个任务到线程池中执行。最后使用 `Future.get()` 方法获取任务的执行结果,并将两个结果拼接起来。 除了使用线程池以外,Java 8 还提供了一些其他的工具和 API 来帮助我们进行多任务并行处理,比如 `CompletableFuture` 和 `Stream API` 等。 ### 回答2: Java 8引入了新的特性来支持多任务并行处理。其中最常用的特性是流(Stream)和并行流(Parallel Stream)。 流(Stream)是一种功能强大的数据处理工具,它可以让我们以声明式的方式来处理集合或数组。通过使用流,我们可以通过一系列的中间操作过滤、映射或排序数据,并最终进行终端操作,例如求和或聚合。流的特点是可以自动进行数据分块处理,这样可以提高数据处理的效率。但是,普通的流只能在一个线程中进行操作,无法利用多核心处理器的优势。 为了解决这个问题,Java 8引入了并行流(Parallel Stream)这个概念。并行流可以将一个流中的元素自动分块处理,并在多个线程中同时进行处理。这样,我们就可以充分利用多核心处理器的能力,加快数据处理的速度。 使用并行流非常简单,只需要将普通的流调用parallel()方法即可将其转换为并行流。然后,在进行终端操作时,例如使用forEach()或reduce()方法,流会自动将元素分块处理分发给多个线程进行并行处理。在使用并行流时,我们需要注意线程安全的问题,确保共享的数据是可变的。 除了并行流,Java 8还引入了新的线程池框架来支持多任务并行处理。通过使用Fork/Join框架,我们可以将一个任务分解成多个子任务,并通过递归方式并行处理子任务,最后将它们的结果合并起来。这样可以更容易地在多核心处理器上实现任务的并行处理。 总之,Java 8提供了多种方式来支持并行处理,包括并行流和Fork/Join框架。通过合理地使用这些特性,我们可以充分利用多核心处理器的能力,提高程序的执行效率。 ### 回答3: Java 8引入了新的并行处理能力,使得多任务处理变得更加简单和高效。Java 8使用了Stream API来实现并行处理,这是一种能够处理大量数据的流式处理方式。 在Java 8中,我们可以使用Stream API来处理集合、数组等数据源。通过调用`parallelStream`方法,我们可以将Stream转换为并行流,从而实现并行处理并行处理的好处在于它可以将大量数据分成多个小块,并使用多个线程同时处理这些小块。这样可以充分利用计算资源,提高处理速度。 在并行处理中,我们可以使用`forEach`方法来对每个元素进行处理,也可以使用`map`方法来对元素进行映射。此外,我们还可以在并行处理中使用`filter`方法来过滤元素,或者使用`reduce`方法来将元素进行归约。 值得注意的是,并行处理可能会引发线程安全问题。在使用并行处理时,我们要确保共享对象的线程安全。另外,我们还要避免在并行流中执行有副作用的操作,因为这可能导致意外结果。 总之,Java 8的并行处理能力为我们提供了一种高效处理大量数据的方式。通过使用Stream API,我们可以轻松实现多任务的并行处理,并充分利用计算资源,加快程序的执行速度。然而,在使用并行处理时,我们需要注意线程安全和副作用等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪悟道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值