亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

線程池ThreadPoolExecutor并行處理實現(xiàn)代碼

 更新時間:2020年11月10日 10:11:32   作者:牛鼻子老趙  
這篇文章主要介紹了線程池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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • java實現(xiàn)二叉樹遍歷的三種方式

    java實現(xiàn)二叉樹遍歷的三種方式

    這篇文章主要為大家詳細介紹了java實現(xiàn)二叉樹遍歷的三種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Maven實戰(zhàn)之搭建Maven私服和鏡像的方法(圖文)

    Maven實戰(zhàn)之搭建Maven私服和鏡像的方法(圖文)

    本篇文章主要介紹了搭建Maven私服和鏡像的方法(圖文),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • java語言基礎之標識符和命名規(guī)則詳解

    java語言基礎之標識符和命名規(guī)則詳解

    這篇文章主要給大家介紹了關于java語言基礎之標識符和命名規(guī)則的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • MyBatis學習教程(七)-Mybatis緩存介紹

    MyBatis學習教程(七)-Mybatis緩存介紹

    MyBatis緩存分為一級緩存和二級緩存一級緩存,本文給大家介紹mybatis緩存知識,非常不錯具有參考借鑒價值,感興趣的朋友一起學習吧
    2016-05-05
  • 使用Spring從YAML文件讀取內(nèi)容映射為Map方式

    使用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操作

    這篇文章主要介紹了SpringBoot+Mybatis+Vue 實現(xiàn)商品模塊的crud操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Java中正則表達式的使用和詳解(下)

    Java中正則表達式的使用和詳解(下)

    這篇文章主要介紹了Java正則表達式的使用和詳解(下)的相關資料,包括常用正則表達式和正則表達式語法,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧
    2017-04-04
  • 詳解Java排序算法中的冒泡和選擇排序

    詳解Java排序算法中的冒泡和選擇排序

    這篇文章主要給大家介紹了Java排序算法中的冒泡排序和選擇排序,文中有詳細的圖文解釋和代碼示例,對我們學習Java算法有一定的幫助,感興趣的同學可以參考閱讀下
    2023-06-06
  • 詳解SpringBoot如何實現(xiàn)多環(huán)境配置

    詳解SpringBoot如何實現(xiàn)多環(huán)境配置

    在實際的軟件開發(fā)過程中,一個應用程序通常會有多個環(huán)境,pring?Boot?提供了一個非常靈活和強大的方式來管理這些環(huán)境配置,下面就跟隨小編一起學習一下吧
    2023-07-07
  • springcloud 中 zuul 修改請求參數(shù)信息的方法

    springcloud 中 zuul 修改請求參數(shù)信息的方法

    這篇文章主要介紹了springcloud 中 zuul 修改請求參數(shù)信息的方法,需要的朋友可以參考下
    2018-02-02

最新評論