最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年11月10日 10:11:32   作者:牛鼻子老趙  
這篇文章主要介紹了線程池ThreadPoolExecutor并行處理實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

1、定義一個(gè)接口 Animal

package com.zh.vo;
public interface Animal {
  void work();
}

2、定義一個(gè)實(shí)現(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、定義一個(gè)實(shí)現(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、定義一個(gè)實(shí)現(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、定義一個(gè)枚舉類 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è)操作類 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è)試主類使用 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è)試主類使用 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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java19新特性中外部函數(shù)與內(nèi)存API

    Java19新特性中外部函數(shù)與內(nèi)存API

    Java19引入的外部函數(shù)與內(nèi)存API(預(yù)覽功能)是Project Panama一部分,旨在簡(jiǎn)化Java與本地代碼及非堆內(nèi)存的交互,提供更低層次的編程能力,解決了傳統(tǒng)JNI調(diào)用的復(fù)雜性、安全性和性能局限,特別適合高性能計(jì)算和系統(tǒng)編程領(lǐng)域,感興趣的可以了解一下
    2024-09-09
  • TOMCAT內(nèi)存溢出及大小調(diào)整的實(shí)現(xiàn)方法

    TOMCAT內(nèi)存溢出及大小調(diào)整的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猅OMCAT內(nèi)存溢出及大小調(diào)整的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • Java入門案列之猜拳小游戲

    Java入門案列之猜拳小游戲

    這篇文章主要為大家詳細(xì)介紹了Java入門案列之猜拳小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Java零基礎(chǔ)入門數(shù)組

    Java零基礎(chǔ)入門數(shù)組

    數(shù)組對(duì)于每一門編程語(yǔ)言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語(yǔ)言對(duì)數(shù)組的實(shí)現(xiàn)及處理也不盡相同。Java?語(yǔ)言中提供的數(shù)組是用來存儲(chǔ)固定大小的同類型元素
    2022-04-04
  • SpringMVC全局異常處理的三種方式

    SpringMVC全局異常處理的三種方式

    這篇文章主要介紹了SpringMVC全局異常處理的三種方式,幫助大家更好的理解和使用springmvc,感興趣的朋友可以了解下
    2021-01-01
  • 史上最全圖文講解Java泛型

    史上最全圖文講解Java泛型

    泛型在java中有很重要的地位,在面向?qū)ο缶幊碳案鞣N設(shè)計(jì)模式中有非常廣泛的應(yīng)用,下面這篇文章主要給大家介紹了Java泛型的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • Nacos配置中心設(shè)計(jì)原理分析

    Nacos配置中心設(shè)計(jì)原理分析

    今天分享一下Nacos配置變更的相關(guān)知識(shí)點(diǎn),現(xiàn)在使用Java生態(tài)如果使用微服務(wù),如果部署在K8s上,那么可能會(huì)使用ConfigMap來存儲(chǔ)配置文件,如果沒有使用K8s,那么基本上都使用Nacos來做配置中心,所以有必要了解一下Nacos的配置的知識(shí)點(diǎn),本文只是對(duì)其中的部分實(shí)現(xiàn)原理進(jìn)行分析
    2023-10-10
  • Springboot簡(jiǎn)單熱部署實(shí)現(xiàn)步驟解析

    Springboot簡(jiǎn)單熱部署實(shí)現(xiàn)步驟解析

    這篇文章主要介紹了Springboot簡(jiǎn)單熱部署實(shí)現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java實(shí)現(xiàn)圖片上傳至FastDFS入門教程

    Java實(shí)現(xiàn)圖片上傳至FastDFS入門教程

    這篇文章主要介紹了Java實(shí)現(xiàn)圖片上傳至FastDFS入門教程,通過前端ajax提交圖片到后端,java處理服務(wù)器文件上傳至FastDFS文件服務(wù)器系統(tǒng),以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 一篇文章幫你搞懂什么是java的進(jìn)程和線程

    一篇文章幫你搞懂什么是java的進(jìn)程和線程

    這篇文章主要介紹了java 線程詳解及線程與進(jìn)程的區(qū)別的相關(guān)資料,網(wǎng)上關(guān)于java 線程的資料很多,對(duì)于進(jìn)程的資料很是,這里就整理下,需要的朋友可以參考下
    2021-08-08

最新評(píng)論

黑山县| 长汀县| 衡阳市| 新乐市| 嘉善县| 内乡县| 荔浦县| 资中县| 景东| 大城县| 克东县| 新干县| 浦北县| 公安县| 乳山市| 方城县| 华容县| 安康市| 广宗县| 佛坪县| 上林县| 盐津县| 宜宾市| 尼木县| 宁津县| 大港区| 宜州市| 云梦县| 怀柔区| 上蔡县| 泗阳县| 瑞丽市| 晋城| 万宁市| 河北省| 百色市| 隆化县| 陆川县| 哈密市| 来凤县| 双柏县|