線程池ThreadPoolExecutor并行處理實現(xiàn)代碼
1、定義一個接口 Animal
package com.zh.vo;
public interface Animal {
void work();
}
2、定義一個實現(xiàn)類 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、定義一個實現(xiàn)類 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、定義一個實現(xiàn)類 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 執(zhí)行主流程
* @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 講任務(wù)提交到線程池中執(zhí)行
* @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 線程中有未完成的任務(wù)需等待完成
*/
private static void waitForAllThreadFinish() {
while (threadPoolExecutor.getQueue().size() > 0 || threadPoolExecutor.getActiveCount() > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
8、執(zhí)行結(jié)果
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 執(zhí)行主流程
* @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 講任務(wù)提交到線程池中執(zhí)行
* @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 線程中有未完成的任務(wù)需等待完成
*/
private static void waitForAllThreadFinish() {
while (threadPoolExecutor.getQueue().size() > 0 || threadPoolExecutor.getActiveCount() > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
10、執(zhí)行結(jié)果
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 底層調(diào)用execute方法
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python 多進程并行編程 ProcessPoolExecutor的實現(xiàn)
- java 定時器線程池(ScheduledThreadPoolExecutor)的實現(xiàn)
- Java線程池ThreadPoolExecutor原理及使用實例
- 解決python ThreadPoolExecutor 線程池中的異常捕獲問題
- ThreadPoolExecutor線程池的使用方法
- Java ThreadPoolExecutor 線程池的使用介紹
- Spring線程池ThreadPoolExecutor配置并且得到任務(wù)執(zhí)行的結(jié)果
- ThreadPoolExecutor線程池原理及其execute方法(詳解)
相關(guān)文章
Maven實戰(zhàn)之搭建Maven私服和鏡像的方法(圖文)
本篇文章主要介紹了搭建Maven私服和鏡像的方法(圖文),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12
MyBatis學(xué)習(xí)教程(七)-Mybatis緩存介紹
MyBatis緩存分為一級緩存和二級緩存一級緩存,本文給大家介紹mybatis緩存知識,非常不錯具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)吧2016-05-05
使用Spring從YAML文件讀取內(nèi)容映射為Map方式
這篇文章主要介紹了使用Spring從YAML文件讀取內(nèi)容映射為Map方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot+Mybatis+Vue 實現(xiàn)商品模塊的crud操作
這篇文章主要介紹了SpringBoot+Mybatis+Vue 實現(xiàn)商品模塊的crud操作,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
詳解SpringBoot如何實現(xiàn)多環(huán)境配置
在實際的軟件開發(fā)過程中,一個應(yīng)用程序通常會有多個環(huán)境,pring?Boot?提供了一個非常靈活和強大的方式來管理這些環(huán)境配置,下面就跟隨小編一起學(xué)習(xí)一下吧2023-07-07
springcloud 中 zuul 修改請求參數(shù)信息的方法
這篇文章主要介紹了springcloud 中 zuul 修改請求參數(shù)信息的方法,需要的朋友可以參考下2018-02-02

