• java并发框架--Executor


    Executor简介

    主要类

    例子1

    package exexutorTest;
    
    
    /**
     * 测试类
     */
    public class Main {
        public static void main(String[] args) {
            //创建执行服务器
            Server server = new Server();
    
            //创建100个任务,并发给执行器,等待完成
            for (int i = 0; i < 100; i++) {
            Task task = new Task("id "+ i);
            server.submitTask(task);//执行任务
            }
            server.endServer();
        }
    }
    
    
    package exexutorTest;
    
    
    import java.util.Date;
    
    /**
     * 任务类
     */
    public class Task implements Runnable {
    
        private String id;//任务id
    
        public Task(String id) {
            this.id = id;
        }
    
        @Override
        public void run() {
            try {
                Long duration=(long)(Math.random()*1000);
                System.out.printf("%s: Task %s: Doing a task during %d seconds
    ",Thread.currentThread().getName(),id,duration);
                Thread.sleep(duration);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            System.out.printf("%s: Task %s: Finished on: %s
    ",Thread.currentThread().getName(),id,new Date());
        }
    }
    
    
    package exexutorTest;
    
    import java.util.concurrent.Executors;
    import java.util.concurrent.ThreadPoolExecutor;
    
    public class Server {
        private ThreadPoolExecutor executor;//线程池
        public Server() {
            executor =(ThreadPoolExecutor) Executors.newCachedThreadPool();//创建默认线程池(大小可变)
           // executor = Executors.newFixedThreadPool(10);//固定大小
        }
    
        public void submitTask(Task task){
            System.out.println("A new Task has arrived");
            executor.execute(task);//无返回值,在将来某个时候执行给定的任务
    
            System.out.printf("Server: Pool Size: %d
    ",executor.getPoolSize());
            System.out.printf("Server: Active Count: %d
    ",executor.getActiveCount());
            System.out.printf("Server: Completed Tasks: %d
    ",executor.getCompletedTaskCount());
        }
        public void endServer(){
           executor.shutdown();
        }
    }
    
    

    例子2

    
    /**
     * 计算1-1000总和,分成10个任务计算
     */
    package sumTest;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    import java.util.concurrent.ThreadPoolExecutor;
    
    public class SumTest {
        public static void main(String[] args) {
            // 执行线程池
            ThreadPoolExecutor executor=(ThreadPoolExecutor) Executors.newFixedThreadPool(4);
    
            List<Future<Integer>> resultList=new ArrayList<>();
    
            //统计1-1000总和,分成10个任务计算,提交任务
            for (int i=0; i<10; i++){
                SumTask calculator=new SumTask(i*100+1, (i+1)*100);
                Future<Integer> result=executor.submit(calculator);
                resultList.add(result);
            }
    
            do {
                System.out.printf("Main: 已经完成多少个任务: %d
    ",executor.getCompletedTaskCount());
                System.out.println("结果长度"+resultList.size());
                for (int i=0; i<resultList.size(); i++) {
                    Future<Integer> result=resultList.get(i);
                    System.out.printf("Main: Task %d: %s
    ",i,result.isDone());
                }
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }while (executor.getCompletedTaskCount()<resultList.size());//计算的线程运行完毕
    
            int total = 0;
            for (int i=0; i<resultList.size(); i++) {
                Future<Integer> result=resultList.get(i);
                Integer sum=null;
                try {
                    sum=result.get();
                    total = total + sum;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }
            System.out.printf("1-1000的总和:" + total);
    
            // 关闭线程池
            executor.shutdown();
    
        }
    }
    
    
    package sumTest;
    
    import java.util.Random;
    import java.util.concurrent.Callable;
    
    public class SumTask implements Callable {
        private int start;
        private int end;
    
        public SumTask(int start, int end) {
            this.start = start;
            this.end = end;
        }
    
        @Override
        public Integer call() throws Exception {
            int sum = 0;
            for (int i = start; i <= end ; i++) {
                sum += i;
            }
            Thread.sleep(new Random().nextInt(1000));
            System.out.printf("%s: %d
    ",Thread.currentThread().getName(),sum);
            return sum;
        }
    }
    
    
    不一样的烟火
  • 相关阅读:
    Scala编译环境搭建(mac IDEA)
    Scala初见
    boost spirit使用
    基于OPENCV的图像融合
    C++获取hostname&IP&MAC地址
    httpd启动检查
    react eslint 代码格式补全的插件
    将html页面导出为word
    redux的笔记
    img onerror事件的使用
  • 原文地址:https://www.cnblogs.com/cstdio1/p/12259616.html
Copyright © 2020-2023  润新知