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