線程池ThreadPoolExecutor并行處理實(shí)現(xiàn)代碼
1、定義一個(gè)接口 Animal
package com.zh.vo; public interface Animal { void work(); }
2、定義一個(gè)實(shí)現(xiàn)類(lèi) 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、定義一個(gè)實(shí)現(xiàn)類(lèi) 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、定義一個(gè)實(shí)現(xiàn)類(lèi) 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、定義一個(gè)枚舉類(lèi) 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、定義一個(gè)操作類(lèi) 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、定義一個(gè)測(cè)試主類(lèi)使用 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 測(cè)試線程池 * @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、定義一個(gè)測(cè)試主類(lèi)使用 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 測(cè)試線程池 * @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方法
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python 多進(jìn)程并行編程 ProcessPoolExecutor的實(shí)現(xiàn)
- java 定時(shí)器線程池(ScheduledThreadPoolExecutor)的實(shí)現(xiàn)
- Java線程池ThreadPoolExecutor原理及使用實(shí)例
- 解決python ThreadPoolExecutor 線程池中的異常捕獲問(wèn)題
- ThreadPoolExecutor線程池的使用方法
- Java ThreadPoolExecutor 線程池的使用介紹
- Spring線程池ThreadPoolExecutor配置并且得到任務(wù)執(zhí)行的結(jié)果
- ThreadPoolExecutor線程池原理及其execute方法(詳解)
相關(guān)文章
java實(shí)現(xiàn)二叉樹(shù)遍歷的三種方式
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)二叉樹(shù)遍歷的三種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01Maven實(shí)戰(zhàn)之搭建Maven私服和鏡像的方法(圖文)
本篇文章主要介紹了搭建Maven私服和鏡像的方法(圖文),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12java語(yǔ)言基礎(chǔ)之標(biāo)識(shí)符和命名規(guī)則詳解
這篇文章主要給大家介紹了關(guān)于java語(yǔ)言基礎(chǔ)之標(biāo)識(shí)符和命名規(guī)則的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03MyBatis學(xué)習(xí)教程(七)-Mybatis緩存介紹
MyBatis緩存分為一級(jí)緩存和二級(jí)緩存一級(jí)緩存,本文給大家介紹mybatis緩存知識(shí),非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-05-05使用Spring從YAML文件讀取內(nèi)容映射為Map方式
這篇文章主要介紹了使用Spring從YAML文件讀取內(nèi)容映射為Map方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02SpringBoot+Mybatis+Vue 實(shí)現(xiàn)商品模塊的crud操作
這篇文章主要介紹了SpringBoot+Mybatis+Vue 實(shí)現(xiàn)商品模塊的crud操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10詳解SpringBoot如何實(shí)現(xiàn)多環(huán)境配置
在實(shí)際的軟件開(kāi)發(fā)過(guò)程中,一個(gè)應(yīng)用程序通常會(huì)有多個(gè)環(huán)境,pring?Boot?提供了一個(gè)非常靈活和強(qiáng)大的方式來(lái)管理這些環(huán)境配置,下面就跟隨小編一起學(xué)習(xí)一下吧2023-07-07springcloud 中 zuul 修改請(qǐng)求參數(shù)信息的方法
這篇文章主要介紹了springcloud 中 zuul 修改請(qǐng)求參數(shù)信息的方法,需要的朋友可以參考下2018-02-02