zoukankan      html  css  js  c++  java
  • 线程池

    package com.zhl.practice;
    
    import java.util.concurrent.*;
    
    /**
     * @author Holley
     * @Description 多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程( 其中callable依赖于线程池)
     * @create 2019-05-27 11:20
     **/
    public class CallableAndFutureTest {
    
        public static void main(String[] args){
            // 创建线程池(单线程)
    //        ExecutorService executorService = Executors.newSingleThreadExecutor();
            // 具有固定条数线程的线程池
            ExecutorService executorService = Executors.newFixedThreadPool(2);
            // 可变线程池,当线程数不够时,自动新增线程
    //        ExecutorService executorService = Executors.newCachedThreadPool();
            // 无返回值的线程调用
    //        executorService.execute(new Runnable() {
    //            @Override
    //            public void run() {
    //                System.out.println("线程执行任务代码");
    //            }
    //        });
            //具有返回值的线程调用
            Future future = executorService.submit(
                    new Callable<String>() {
                        @Override
                        public String call() {
                            try {
                                Thread.sleep(5000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            return "测试结果:aaa";
                        }
                    }
            );
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    int i = 0;
                    while (i < 6){
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(System.currentTimeMillis());
                        i++;
                    }
                }
            });
            try {
                // 获取线程返回结果会等待该线程执行完毕之后才会返回,此代码中将在5秒后打印出  线程返回值:测试结果:aaa
                System.out.println("线程返回值:" + future.get());
                // 强制在一秒钟后获取返回结果,如果获取不到此时会抛出异常java.util.concurrent.TimeoutException
    //            System.out.println("线程返回值:" + future.get(1,TimeUnit.SECONDS));
            } catch (Exception e) {
                e.printStackTrace();
            }
    
    //        completionService用于提交一组任务,其take方法返回已完成的一个Callable任务对应的Futrue对象
            ExecutorService executorService12 = Executors.newSingleThreadExecutor();
    //        CompletionService是一个接口,只能通过他的实现类ExecutorCompletionService来创建实例化
            CompletionService<String> completionService = new ExecutorCompletionService(executorService12);
            // 提交十条任务
            for(int i = 1;i<10;i++) {
                // 只能定义成final型变量才能在下面重写的new Callable(){ call(){}}方法中调用
                final int taskId = i;
                completionService.submit(() -> {
                    Thread.sleep(1000);
                    System.out.println("任务id:" + taskId);
                    return "结果"+taskId;
                });
            }
            try {
                for(int i = 1;i<10;i++) {
                    // 每次只输出一个任务的返回值(无固定顺序)
                    System.out.println(completionService.take().get());
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
    
        }
    }
  • 相关阅读:
    golang 垃圾回收 gc
    LINUX下目标文件的BSS段、数据段、代码段
    使用Golang利用ectd实现一个分布式锁
    KNN算法介绍
    机器学习
    golang map to struct
    NoSQL数据库-MongoDB和Redis
    Go语言中的单引号、双引号、反引号
    广告制胜无它,顺应人性尔——leo鉴书63
    从周迅发布恋情 看百度百科的社会价值
  • 原文地址:https://www.cnblogs.com/zhlblogs/p/10930508.html
Copyright © 2011-2022 走看看