线程池ThreadPoolExecutor并行处理实现代码

 更新时间:2020年11月10日 10:11:32   作者:牛鼻子老赵  
这篇文章主要介绍了线程池ThreadPoolExecutor并行处理实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1、定义一个接口 Animal

package com.zh.vo;
public interface Animal {
  void work();
}

2、定义一个实现类 Bird

package com.zh.vo;

public class Bird implements Animal {

  @Override
  public void work() {
    int sum = 0;
    for (int i = 0; i < 100000; i++) {
      sum += i;
    }
    System.out.println("Bird calc: " + sum + " time: " + System.currentTimeMillis());
  }

}

3、定义一个实现类 Cat

package com.zh.vo;
public class Cat implements Animal {
  @Override
  public void work() {
    int sum = 0;
    for (int i = 0; i < 100000; i++) {
      sum += i;
    }
    System.out.println("Cat calc: " + sum + " time: " + System.currentTimeMillis());
  }

}

4、定义一个实现类 Dog

package com.zh.vo;

public class Dog implements Animal {

  @Override
  public void work() {
    int sum = 0;
    for (int i = 0; i < 100000; i++) {
      sum += i;
    }
    System.out.println("Dog calc: " + sum + " time: " + System.currentTimeMillis());
  }

}

5、定义一个枚举类 AnimalEnum

package com.zh.enums;

import com.zh.vo.Bird;
import com.zh.vo.Cat;
import com.zh.vo.Dog;

public enum AnimalEnum {

  CAT("cat", Cat.class), DOG("dog", Dog.class), BIRD("bird", Bird.class);

  private String name;
  private Class<?> clazz;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Class<?> getClazz() {
    return clazz;
  }

  public void setClazz(Class<?> clazz) {
    this.clazz = clazz;
  }

  private AnimalEnum(String name, Class<?> clazz) {
    this.name = name;
    this.clazz = clazz;
  }

  public static void main(String[] args) {
    // System.out.println(getName(DOG));
    // System.out.println(getClazz(DOG));
    AnimalEnum[] values = AnimalEnum.values();
    System.out.println(values);
  }
}

6、定义一个操作类 AnimalUtil

package com.zh.utils;

import java.util.HashMap;
import java.util.Map;
import com.zh.enums.AnimalEnum;
import com.zh.vo.Animal;

public enum AnimalUtil {

  INSTANCE;

  private static Map<AnimalEnum, Animal> map = null;

  private synchronized void init() {
    map = new HashMap<AnimalEnum, Animal>();
    AnimalEnum[] values = AnimalEnum.values();
    for (AnimalEnum animalEnum : values) {
      Animal newInstance = null;
      try {
        newInstance = (Animal)animalEnum.getClazz().newInstance();
      } catch (InstantiationException e) {
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      }
      map.put(animalEnum, newInstance);
    }
  }

  public Map<AnimalEnum, Animal> getEnumMaps() {
    if (map == null || map.isEmpty()) {
      init();
    }
    return map;
  }
}

7、定义一个测试主类使用 Future、Callable

package com.zh;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.zh.enums.AnimalEnum;
import com.zh.utils.AnimalUtil;
import com.zh.vo.Animal;

/**
 * @desc 测试线程池
 * @author zhanhao
 */
public class ThreadPoolSubmitTest {

  /**
   * 定义线程池
   */
  // Runtime.getRuntime().availableProcessors() * 2
  private static ThreadPoolExecutor threadPoolExecutor =
    new ThreadPoolExecutor(10, 20, 100, TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>());

  /**
   * @desc 执行主流程
   * @param args
   * @throws InterruptedException
   * @throws ExecutionException
   */
  public static void main(String[] args) throws InterruptedException, ExecutionException {

    Map<String, Future<String>> futureMap = new HashMap<String, Future<String>>();

    Set<Entry<AnimalEnum, Animal>> entrySet = AnimalUtil.INSTANCE.getEnumMaps().entrySet();
    for (Entry<AnimalEnum, Animal> entry : entrySet) {
      futureMap.put(entry.getKey().getName(), exec(entry.getKey()));
    }

    for (Entry<String, Future<String>> entry : futureMap.entrySet()) {
      System.out.println(entry.getValue().get());
    }
    waitForAllThreadFinish();
    threadPoolExecutor.shutdown();
  }

  /**
   * @desc 讲任务提交到线程池中执行
   * @param enums
   * @return
   */
  private static Future<String> exec(AnimalEnum enums) {
    return threadPoolExecutor.submit(new Callable<String>() {
      @Override
      public String call() throws Exception {
        Animal animal = AnimalUtil.INSTANCE.getEnumMaps().get(enums);
        animal.work();
        return Thread.currentThread().getName();
      }
    });
  }

  /**
   * @desc 线程中有未完成的任务需等待完成
   */
  private static void waitForAllThreadFinish() {
    while (threadPoolExecutor.getQueue().size() > 0 || threadPoolExecutor.getActiveCount() > 0) {
      try {
        Thread.sleep(10);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }

}

8、执行结果

Dog calc: 704982704 time: 1574129306137
Bird calc: 704982704 time: 1574129306137
Cat calc: 704982704 time: 1574129306137
pool-1-thread-1
pool-1-thread-2
pool-1-thread-3

9、定义一个测试主类使用 Runnable

package com.zh;

import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.zh.enums.AnimalEnum;
import com.zh.utils.AnimalUtil;
import com.zh.vo.Animal;

/**
 * @desc 测试线程池
 * @author zhanhao
 */
public class ThreadPoolExecuteTest {

  /**
   * 定义线程池
   */
  // Runtime.getRuntime().availableProcessors() * 2
  private static ThreadPoolExecutor threadPoolExecutor =
    new ThreadPoolExecutor(10, 20, 100, TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>());

  /**
   * @desc 执行主流程
   * @param args
   * @throws InterruptedException
   * @throws ExecutionException
   */
  public static void main(String[] args) throws InterruptedException, ExecutionException {
    Set<Entry<AnimalEnum, Animal>> entrySet = AnimalUtil.INSTANCE.getEnumMaps().entrySet();
    for (Entry<AnimalEnum, Animal> entry : entrySet) {
      exec(entry.getKey());
    }
    waitForAllThreadFinish();
    threadPoolExecutor.shutdown();
  }

  /**
   * @desc 讲任务提交到线程池中执行
   * @param enums
   * @return
   */
  private static void exec(AnimalEnum enums) {
    threadPoolExecutor.execute(new Runnable() {
      @Override
      public void run() {
        Animal animal = AnimalUtil.INSTANCE.getEnumMaps().get(enums);
        animal.work();
        System.out.println(Thread.currentThread().getName());
      }
    });
  }

  /**
   * @desc 线程中有未完成的任务需等待完成
   */
  private static void waitForAllThreadFinish() {
    while (threadPoolExecutor.getQueue().size() > 0 || threadPoolExecutor.getActiveCount() > 0) {
      try {
        Thread.sleep(10);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }

}

10、执行结果

Bird calc: 704982704 time: 1574129356078
Dog calc: 704982704 time: 1574129356078
pool-1-thread-3
Cat calc: 704982704 time: 1574129356078
pool-1-thread-1
pool-1-thread-2

注:1、submit 方法可以有返回值 2、submit 底层调用execute方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Springboot下swagger-ui.html访问不到的解决方案

    Springboot下swagger-ui.html访问不到的解决方案

    这篇文章主要介绍了Springboot下swagger-ui.html访问不到的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 我劝你谨慎使用Spring中的@Scheduled注解

    我劝你谨慎使用Spring中的@Scheduled注解

    这篇文章主要介绍了Spring中的@Scheduled注解使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 通过工厂模式返回Spring Bean方法解析

    通过工厂模式返回Spring Bean方法解析

    这篇文章主要介绍了通过工厂模式返回Spring Bean方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • java如何自动补齐数值至指定位数

    java如何自动补齐数值至指定位数

    这篇文章主要介绍了java如何自动补齐数值至指定位数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 详解如何使用SpringBoot封装Excel生成器

    详解如何使用SpringBoot封装Excel生成器

    在软件开发过程中,经常需要生成Excel文件来导出数据或者生成报表,为了简化开发流程和提高代码的可维护性,我们可以使用Spring Boot封装Excel生成器,本文将介绍如何使用Spring Boot封装Excel生成器,并提供一些示例代码来说明其用法和功能
    2023-06-06
  • Spring中的@RestController注解详细解析

    Spring中的@RestController注解详细解析

    这篇文章主要介绍了Spring中的@RestController注解详细解析,@RestController 是 Spring Framework 中的一个注解,用于标识一个类为 RESTful Web 服务的控制器(Controller),处理 HTTP 请求并返回相应的数据,
    2024-01-01
  • 关于springmvc报错404的问题

    关于springmvc报错404的问题

    这篇文章主要介绍了关于springmvc报错404的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Java如何使用SSLContext请求https链接

    Java如何使用SSLContext请求https链接

    这篇文章主要介绍了Java如何使用SSLContext请求https链接问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java日常练习题,每天进步一点点(9)

    Java日常练习题,每天进步一点点(9)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • Jmeter固定定时器的使用详解

    Jmeter固定定时器的使用详解

    jmeter提供了多种定时器以便于我们进行接口的测试,你知道jmeter提供的定时器有哪些吗,本文就详细的介绍了Jmeter固定定时器的使用,感兴趣的可以了解一下
    2021-11-11

最新评论