线程与线程池

Posted 亮子zl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程与线程池相关的知识,希望对你有一定的参考价值。

====================
====================CallableDemo 线程
====================     

class MyThread implements Callable<Integer>
    pubic Integer call() throws Exception
          System.out.println("8888888888888888");
          return 1024;
    

public static void main()
     FutureTask<Integer> futureTask = new FutureTask<>(new MyThread()); 
     Thread t1 = new Thread(futureTask,name:"AAA");
     t1.start();
     System.out.println("**************result:"+futureTask.get());

为什么用线程池,优势?
     答:线程池做的工作主要是控制的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大
         数量超出数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。
         
         他的主要特点为:线程复用;控制最大并发数;管理线程。
         
         1、降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
         2、提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
         3、提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的
            分配,调优和监控。
     
线程池如何使用?
        架构说明:
             Java中的线程池是通过 Executor 框架实现的,该框架中用到了Executor,Executors,ExecutorService,ThreadPoolExecutor这几个类。
                                   一克Q特   一克塞K的
        编码实现:
             Executors.newScheduledThreadPool()//执行调度的带时间的
             Executors.newWorkStealingPool(int)//java新增,使用目前机器上可用的处理器作为它的并行级别
             
             重点:
             ThreadPoolExecutor //线程池的底层就是这个类
     
             //创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。LinkedBlockingQueue     
             Executors.newFixedThreadPool(int)//执行长期的任务,性能好很多  Fixed  /fɪkst/ 费克思的

             //创建一个单线程代的线程池,它只会用唯一的工作线程来执行任务,保证的有任务按照指定顺序执行。LinkedBlockingQueue
             Executors.newSingleThreadExecutor()//一个任务一个任务执行的场景   Single  /ˈsɪŋɡl/ 星狗  Executor /ɪɡˈzekjətə(r)/ 一克塞K的

             //创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
             SynchronousQueue,也就是说来了任务就创建线程运行,当线程空闲超过60秒,就销毁线程。
             Executors.newCachedThreadPool()//适用:执行很多短期异步的小程序或者负载较轻的服务器 Cached 卡死t
             
        例:
        

public  static void  main(String[] args)
             ExecutorService threadPool = Executors.newFixedThreadPool(5);//一池5个处理线程
             ExecutorService threadPool = Executors.newSingleThreadExecutor();//一池1个处理线程
             ExecutorService threadPool = Executors.newCachedThreadPool();//一池N个处理线程
             try
                for (int i=1;i<=10;i++)
                     threadPool.Execute(()->
                       System.out.println(Thread.currentThread().getName()+"\\t办理业务");
                     );
                
             catch(Exception e)
                e.printStackTrace();
             finally
                 threadPool.shutdown();
             
        


        例:2
      

 public static void main()
             ExecutorService service= Executors.newFixedThreadPool(10);
             ThreadPoolExecutor service2 = (ThreadPoolExecutor)service;
             service2.setCorePoolSize(15);
             service2.setKeepAliveTime();
             
             service.execute(new NumberThread);
             
             service.shutdown(); 
        

ThreadPoolExecutor:线程池的低层就是这个类

线程池的几个重要参数介绍?

。。。

说说线程池的底层工作原理?
线程池的工作原理,几个重要参数,然后给了具体几个参数分析线程池会怎么做,最后问阻塞队列的作用是什么
    答:线程池的七大参数
        1、corePoolSize:线程池中的常驻核心 线程数  酷 
                   在创建了线程池后,当有请求任务来之后,就会安排池中的线程去执行请求任务,近似理解为今日当值线程
                   当线程池中的线程数目达到corePoolSize后,就会把到达任务放到缓存队列当中
        2、maximumPoolSize:线程池能够容纳同进执行的最大线程数,此值必须大于等于1
        3、keepAliveTime:多余的空闲线程的存活时间。  Kp 饿赖夫  太么
           当前线程池数量超过corePoolSize时,当空闲时间达到keepAliveTime值时,
           多余空闲线程会被销毁直到只剩下 corePoolSize个线程为止。
        4、unit:keepAliveTime的单位。 
        5、workQueue:任务队列,被提交但尚未被执行的任务。  
        6、threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般用默认的即可。
        7、handler:拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何来

线程池用过吗?生产上你如何设置合于是理的参数
|----线程池的拒绝策略你谈炎
|---------等待队列也已经排满了,再也塞不下新任务了同时线程池中的max线程也达到了,无法继续为新任务服务。这时候我们就需要拒绝策略机制合理的处理这个问题。
|---------线程池的4种拒绝策略理论(JDK内置的拒绝策略)
|---------AbortPolicy(默认):直接抛出RejectedExecutionException异常阻止系统正常运行。饿不特
|---------CallerRunsPolicy:“调用者运行”一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。酷了 万思 趴了s
|---------DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交当前任务。 
|---------DiscardPolicy:直接丢弃任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种方案。
          以上内置拒绝策略均实现了RejectedExecutionHandler接口
          
|----你在工作中单量的、固定数的、可变的三种创建线程池的方法,你用那个多?超级大坑
          答:三种线程池一个都不用,我们生产上只能用自定义的Executors中JDK已经给你提供了,为什么不用?
              线程池不允使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
              说明:Executors返回的线程池对象的弊端如下:
              1、FixedThreadPool和SingleThreadPool:
                  允许的请求队列长度为Integer.MAX_value,可能会堆积大量的请求,从而导致OOM。
              2、CachedThreadPool和ScheduledThreadPool:
                 允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。
          

以上是关于线程与线程池的主要内容,如果未能解决你的问题,请参考以下文章

细数ThreadLocal三大坑,内存泄露仅是小儿科

细数ThreadLocal三大坑,内存泄露仅是小儿科

ThreadLocal与线程池共用时可能出现的的两个问题

java线程池原理解析

java线程池原理解析

线程池参数与线程池调优