zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
    
    不一样的烟火
  • 相关阅读:
    sqlMetal用法和例子 自定义DBML
    List使用Foreach 修改集合时,会报错的解决方案 (Error: Collection was modified; enumeration operation may not execute. )
    HTTP 和 SOAP 标头 来传递用户名密码 验证webservice用户认证
    static与线程安全 -摘自网络
    Win7 64位 安装E10后 打不开的解决方案 -摘自网络
    JQuery Dialog 禁用X按钮关闭对话框,-摘自网络
    MVC client validation after PartialView loaded via Ajax MVC3中 弹出 Dialog时候 提交的时候 使用 Jquery 不验证 form表单 的解决办法
    授权给adfs读取ad 在ad服务器上运行
    Configuring Active Directory Federation Services 2.0 (配置 adfs 2.0) -摘自网络
    MyEclipse10下创建web项目并发布到Tomcat
  • 原文地址:https://www.cnblogs.com/cstdio1/p/12259616.html
Copyright © 2011-2022 走看看