线程池ThreadPoolExecutor并行处理实现代码
作者:牛鼻子老赵 发布时间:2022-10-13 23:44:01
标签:Thread,Pool,Executor,并行,处理
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方法
来源:https://www.cnblogs.com/zhanh247/p/11887510.html


猜你喜欢
- C#貌似没有专门用于ASCII码转字符或字符转ASCII码的系统函数,所以小编这里就借用一下强制类型转换来实现ASCII码与字符之间的互转。
- 前言1.因为涉及到对象锁,Wait、Notify一定要在synchronized里面进行使用。2.Wait必须暂定当前正在执行的线程,并释放
- 本文实例为大家分享了RecyclerView实现水平列表的具体代码,供大家参考,具体内容如下1、效果图2、activity_horizont
- idea spring Initializr创建项目勾选项目所需要的依赖pom.xml文件会加载勾选的依赖,也可以不勾选后面通过自己常用的p
- Controller简介Controller控制器,是MVC中的部分C,为什么是部分呢?因为此处的控制器主要负责功能处理部分:1、收集、验证
- 本文实例讲述了Java文本文件操作方法。分享给大家供大家参考。具体分析如下:最初Java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了
- 问题描述ResultSet 表示 select 语句的查询结果集。ResultSet 对象具有指向其当前数据行的指针, 最初,指针被置于第一
- Java调用shell命令涉及管道、重定向时不生效近日,因项目需求需要用java调用shell命令实现清理过时图片任务,发现代码生成出来的s
- 最近经常在机房看同学在玩一个走迷宫的游戏,比较有趣,自己也用java写一个实现随机生成迷宫的算法,其实就是一个图的深度优先遍历算法.基本思想
- c语言关闭socket的两种方式一、shutdown()#include<sys/socket.h>int shutdown(i
- SpringCloud @FeignClient 参数详解今天因为工作中遇到FeignClient一个奇葩的bug,后面仔细研究了,找出了原
- 安卓中为activity创建菜单,供大家参考,具体内容如下1.在res上面右键 > new > Android xml file
- Mybatis采用责任链模式,通过 * 组织多个 * (插件),通过这些 * 可以改变Mybatis的默认行为(诸如SQL重写之类的),由
- 此文通过一段代码来展示java获取相关参数的方法分享给大家:public static void main(String[] args) {
- 实现二分法查找二分法查找,需要数组内是一个有序的序列二分查找比线性查找:数组的元素数越多,效率提高的越明显二分查找的效率表示:O(log2N
- 1.例如下面的代码片段,Toast类的第一个参数接受一个Context对象:@Override protected Dialog onCr
- 安卓使用SmsManager实现发送短信,供大家参考,具体内容如下关键代码实现package com.example.sms; import
- 本文实例讲述了C#使用GDI+创建缩略图的方法,分享给大家供大家参考。具体方法分析如下:C#的Gdi+还是相当好用的。创建缩略图步骤如下:1
- 目前的应用市场上,使用毛玻璃效果的APP随处可见,比如用过微信语音聊天的人可以发现,语音聊天页面就使用了高斯模糊效果。先看下效果图:&nbs
- 场景:使用MyBatis批量查询(select)、批量插入(insert)、批量更新(update)、批量删除(delete)操作MySQL