zoukankan      html  css  js  c++  java
  • JDK提供的四种线程池代码详解

    一.线程池什么时候使用,会给我们带来什么好处?

    如果很多用户去访问服务器,用户访问服务器的时间是非常短暂的,那么有可能在创建线程和销毁线程上花费的时间会远远大于访问所消耗的时间,如果采用线程池会使线程重复使用大大的提高效率.

    在JDK1.5之前就有了线程池的概念,不过需要我们手动的去实现ThreadPool,在API中并没有叫"线程池"这个名字,而是叫做"执行程序".

    根据CPU的情况 初始化 固定线程个数的线程池.

    获取CPU上有多少个核....int processors = Runtime.getRunntime().availableProcessors()  ;

    JDK1.5之后提供了4中线程池.

    第一种线程池:固定个数的线程池

    ① fixedThreadPool:固定个数的线程池  一般会根据当前计算机的硬件情况来设置具体的最大线程数

    Executors.newFixedThreadPool(5); 

    第二种线程池:缓存的线程池

    ②cachedThreadPool:缓存线程池,无上限.如果并发访问量比较小,就可以使用这个不用考虑太多的问题,如果并发量很大,使用这个线程池会对服务器产生一定的压力

    Executors.newCachedThreadPool();

    第三种线程池:单一线程池

    ③singleThreadPool:单一线程池中永远会有一条线程,如果这条线程出现异常了会新创建一条线程完成其他任务.

    Executors.newSingleThreadExecutor();

    第四种线程池:固定个数的线程池,相比于第一个固定个数的线程池强大在  ①可以执行延时任务,②也可以执行带有返回值的任务。

    ④scheduledThreadPool:固定个数的线程池,可以执行延时任务,也可以执行带有返回值的任务.

    Executors.newScheduledThreadPool(5);

    以上四种具体看代码:(注释和笔记更加详细)

    如果上面的四个都不满足你的要求 可以自定义线程池....要实现ThreadFactory接口.....

     ThreadPoolDemo.java

     1 import java.util.concurrent.Callable;
     2 import java.util.concurrent.ExecutionException;
     3 import java.util.concurrent.ExecutorService;
     4 import java.util.concurrent.Executors;
     5 import java.util.concurrent.FutureTask;
     6 import java.util.concurrent.ScheduledExecutorService;
     7 import java.util.concurrent.TimeUnit;
     8 
     9 public class ThreadPoolDemo {
    10 
    11     public static void main(String[] args) throws InterruptedException, ExecutionException {
    12 
    13         int processors = Runtime.getRuntime().availableProcessors();// 获得计算机有几个内核
    14         // System.out.println("pro : " + processors);
    15 
    16         //第一种线程池:固定个数的线程池
    17         ExecutorService fixedThreadPool = Executors.newFixedThreadPool(processors * 100);// 固定线程个数的线程池  让一个CPU核绑定100个线程,这种方式经常使用.
    18         // System.out.println(fixedThreadPool);
    19         for (int i = 0; i < 10; i++) {
    20             fixedThreadPool.execute(new Runnable() {
    21 
    22                 @Override
    23                 public void run() {
    24                     System.out.println(Thread.currentThread().getName());// pool-1-thread-1
    25                 }
    26             });
    27         }
    28 
    29         fixedThreadPool.shutdown();// 将线程池关闭  在做项目的时候一般是不会将线程池关闭的.
    30 
    31 //=======================================================================================================
    32         //第二种线程池:缓存的线程池  空闲的线程会被循环的利用,线程池中30条线程也许可以处理100个并发
    33         ExecutorService cachedThreadPool = Executors.newCachedThreadPool();// 缓存线程池,无上限
    34 
    35         for (int i = 0; i < 100; i++) {
    36             cachedThreadPool.execute(new Runnable() {
    37 
    38                 @Override
    39                 public void run() {
    40                     System.out.println(Thread.currentThread().getName());
    41                 }
    42             });
    43         }
    44         cachedThreadPool.shutdown();
    45 
    46 //======================================================================================================
    47         //第三种线程池:单一线程池  当你想确保你的机器中只有一个线程运行,即使这个线程即使死了,也能原地满血复活,再有一个线程.
    48         ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();// 单一线程池,永远会维护存在一条线程
    49 
    50         for (int i = 0; i < 10; i++) {
    51             final int j = i;
    52             singleThreadPool.execute(new Runnable() {
    53 
    54                 @Override
    55                 public void run() {
    56                     /*
    57                      * if(j == 3) throw new RuntimeException("出异常了...");
    58                      */
    59                     System.out.println(Thread.currentThread().getName() + ":"
    60                             + j);
    61                 }
    62             });
    63         }
    64         singleThreadPool.shutdown();
    65 //=========================================================================================================
    66         //第四种线程池:固定个数的线程池,相比于第一个固定个数的线程池 强大在   ①可以执行延时任务,②也可以执行带有返回值的任务。
    67         //scheduledThreadPool.submit(); 执行带有返回值的任务
    68         //scheduledThreadPool.schedule()  用来执行延时任务.
    69         ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);//固定个数的线程池,可以执行延时任务,也可以执行带有返回值的任务。
    70 
    71         FutureTask<String> ft = new FutureTask<String>(new Callable<String>() {
    72             @Override
    73             public String call() throws Exception {
    74                 System.out.println("hello");
    75                 return Thread.currentThread().getName();
    76             }
    77         });
    78         scheduledThreadPool.submit(ft);
    79         String result = ft.get();//通过FutureTask对象获得返回值.
    80         System.out.println("result : "+result);
    81         
    82         
    83         scheduledThreadPool.schedule(new Runnable() {
    84             @Override
    85             public void run() {
    86                 System.out.println(Thread.currentThread().getName()+" : bobm!");
    87             }
    88         }, 3, TimeUnit.SECONDS);
    89     }
    90 }
  • 相关阅读:
    Filebeat Processors对日志数据的处理
    beats直接给es传输日志,自定义索引名
    Elasticsearch:修改fielddata
    Elasticsearch:Elasticsearch中的refresh和flush操作指南
    Elasticsearch创建索引(index)及一个文档(document)
    Elasticsearch:如何对PDF文件进行搜索
    C++ 类构造函数 & 析构函数~
    学习CSS的好地方:CSS Inspiration -- CSS灵感
    css式样里的content
    寄存器与cmp,mov,add,sub,IMUL指令
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/6209195.html
Copyright © 2011-2022 走看看