您的位置:首页 > 其它

Thread线程系列之线程池介绍API的简介

2018-03-27 18:58 309 查看

线程池是线程中的重点操作,因为在很多第三方框架中或这项目优化方面有牵扯到使用多个线程去操作的都必然使用线程池去做。那么为啥咧? 

因为,执行一个异步任务,那么就需要开启一个线程去执行,那么执行完此异步任务之后,这个线程就会被关闭掉。那么在项目中,一定会有多个异步任务的执行,这样每个异步任务对应着一个线程,而每个线程的开启与关闭都有一定的资源(性能)的消耗与cpu的开销,所以呢,线程池真是解决此问题而生的。(可能写的不好的地方或难以理解的地方,原因可能是个人语文水平不咋地,没有表达好意思,大家自行百度吧)

本篇java8新增线程池可以不做重点,各位可以扫描一下即可,因为下一篇重点详解(一)中介绍的线程池




(一)线程池的介绍:

    1.Executors.newCachedThreadPool():创建一个具有缓存功能的线程池,系统根据需要创建线程池,这些线程将会被缓存在线程池中。
    2.Executors.newFixedThreadPool(int nThreads):创建一个可重用的,具有固定线程数的线程池。
    3.Executors.newSingleThreadExecutor():创建一个只有单线程的线程池,相当于调用newFixedThreadPool(1)方法。
    4.Executors.newScheduledThreadPool(int corePoolSize):创建一个具有指定线程数的线程池,它可以在指定延迟后执行线程任务。corePoolSize指线程池中所保存的线程数,即线程是空闲的也被保存在线程池内。
    5.Executors.newSingleThreadScheduledExecutor():创建一个只有一个线程的线程池,它可以指定延迟后执行线程任务。
    
    结论:1,2,3方法返回结果ExecutorService(代表一个线程池)对象。
       4,5方法返回ScheduledExecutorService(是ExecutorService的子类,可在指定延迟后执行线程任务)对象
       
   用法:
         (一):ExecutorService代表尽快执行线程的线程池(只要此线程池中有空闲线程,就立即执行线程任务),程序只要将一个Runnable对象或Callable对象(代表线程任务)提交给该线程池,该线程池就会尽快执行任务。
      ExecutorService提供的三个方法的详解:
      *1.Future<?> submit(Runnable task) :将一个Runnable对象提交给指定的线程池,线程池将在有空闲的线程时执行Runnable对象
                  代表的任务。其中Future对象代表Runnable任务的返回值,但是run()方法无返回值,所以Future对象将在run()方法执行结束后返回
                  为null。但可以调用Future中的isDone()或isCancelled()方法来获得Runnable对象执行的状态。
                  
      *2.<T> Future<T> submit(Runnable task, T result) :将一个Runnable对象提交给指定的线程池,线程池将在有空闲的线程时
                  执行Runnable对象代表的任务。其中result显示指定线程执行结束后的返回值,所以Future对象将在run()方法执行结束后返回为result。
                  
      *3.<T> Future<T> submit(Callable<T> task) :将一个Callable对象提交给指定的线程池,线程池将在有空闲的线程时执行Callable对象
                  代表的任务。其中Future对象代表Callable对象里call()方法的返回值。
                 
                  
      (二):ScheduledExecutorService代表可在指定延迟后或周期性的执行线程池任务的线程池
    
      ScheduledExecutorService提供的四个方法的详解:
      *1.ScheduledFuture<?> schedule(Runnable command,long delay, TimeUnit unit)
                  指定command的任务将在delay延迟后执行。
                  
      *2.<V> ScheduledFuture<V> schedule(Callable<V> callable,long delay, TimeUnit unit)
                  指定callable的任务将在delay延迟后执行。
                  
      *3.ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit)           
                 指定command的任务将在delay延迟后执行,而且以设定频率重复执行,也就是说,在initialDelay后开始执行,
                 依次在initialDelay+period,initialDelay+2*period...处重复执行,以此类推。
                 
      *4.ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnit unit)
                 与第三个方法类似,只不过此方法是:如果任务在执行时遇到异常,就会取消后续执行。
                 
                 
           (三):使用完一个线程池后,可以调用两个方法:
       *1.shutdown()方法:该方法将启动线程池的关闭序列,调用此方法后,线程池不再接收新的任务,但它会将以前所有提交的任务执行完成。  当线程池中的所有任务都执行执行完成后,池中所有的线程都会死亡。
       *2.shutdownNow()方法:与上面方法类似。单该方法停止所有任务的执行活动,暂停处理正在等待的任务,并且返回等待执行任务的列表。
     

(二)java8新增线程池的介绍与应用:

    1.Executors.newWorkStealingPool():此方法充分利用多个CPU的并行能力。此方法生成work stealing池,相当于
            后台线程池,如果所有的前台线程都死亡了,work stealing池中的线程会自动死亡。同时此方法相当于下面方法的parallelism的值为4。
            是下面方法的简化版。
            
    2.Executors.newWorkStealingPool(int parallelism):此方法持有创建足够的线程的线程池来支持给定的并行级别,该方法还会使用
          多个队列来减少竞争。  
          
    3.ForkJoinPool:支持将一个任务拆分成多个‘小任务’,将多个小任务放到多个处理器核心上并行执行,当多个小任务执行完成后,在将这些结果合并起来即可。
            它是一个特殊的线程池。提供了两个构造器:一个无参和一个有参的构造。(java7)
            
      *1.有参ForkJoinPool(int parallelism):创建一个包含parallelism个并行线程的ForkJoinPool。
      
      *2.无参ForkJoinPool():以Runtime.getRuntime().availableProcessors()的方法的返回值作为parallelism参数来创建ForkJoinPool。
      
      *3.<T> ForkJoinTask<T> submit(Callable<T> task):执行Callable提交的任务。
      
      *4.<T> ForkJoinTask<T> submit(Runnable task, T result):将一个Runnable对象提交给指定的线程池,线程池将在有空闲的线程时
                  执行Runnable对象代表的任务。其中result显示指定线程执行结束后的返回值,所以Future对象将在run()方法执行结束后返回为result
                  
      *5.ForkJoinTask<?> submit(Runnable task):执行Runnable提交的任务。
      
      *6.<T> ForkJoinTask<T> submit(ForkJoinTask<T> task):ForkJoinTask代表一个并行,合并的任务。ForkJoinTask是一个抽象类。
      
      *7.<T> T invoke(ForkJoinTask<T> task):与上面方法类似。
      
           在java8中扩展了ForkJoinPool的功能。增加了通用池的功能。以下两个静态方法提供通用池功能。
           
      *1.commonPool():该方法返回一个通用池,通用池的运行状态不受shutdown()和shutdownNow()这两个方法的影响,只有当调用System.exit(0)方法
                 来终止java虚拟机的时候,通用池中的任务才会被终止。
                 
      *2.getCommonPoolParallelism():该方法返回通用池的并行级别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: