zoukankan      html  css  js  c++  java
  • Java-多线程第四篇线程池

    1、什么是线程池。

        线程池在系统启动的时候即创建大量的空闲的线程,程序将一个Runnable对象或者Callable对象传给线程池,线程池就会启动一个线程来执行它们的run()或者call()方法,当run()或者call()方法执行结束后,该线程并不会死亡,而是再次返回线程池称为空闲状态,等待执行下一个Runable对象的run()或者call()方法。

        Java 5以前需要手动实现线程池,Java 5后内建了线程池,新增Excutors工厂类来产生线程池,该工厂类包含以下静态工厂方法来创建线程池:

      上面7个方法,前面3个返回一个ExecutorService对象,该对象代表一个线程池,它可以执行Runnable对象或者Callable对象所代表的的线程;中间2个方法返回一个ScheduledExecutorService线程池,它是ExecutorService的子类,它可以在指定延迟后执行线程任务;最后2个是Java 8新增的方法,可以充分利用多CPU并行的能力。这两个方法生成的work stealing池,都相当于后台线程池,如果所有的前台线程都死亡了,work stealing池中的线程会自动死亡。

        ExecutorService代表尽快执行线程的线程池(只要线程池中有空闲线程,就立即执行线程任务),提供了3个方法:

       

       ScheduledExecutorService代表可在指定时延后或者周期性地执行线程任务的线程池,提供了4个方法:

       

       用完一个线程池后,应该调用该线程池的shutdown()方法,该方法将启动线程池的关闭序列。调用该方法后线程池将不再接收新任务,但会将以前所有已提交任务执行完成。所有已提交的任务执行完成后,线程池中所有的线程都会死亡。调用线程池的shutdownNow()方法关闭线程池,将会试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。

       使用线程池的步骤如下:

        1》调用Executors类的静态工厂方法创建一个ExecutorService对象,该对象代表一个线程池。

        2》创建Runnable实现类或者Callable实现类的实例,作为线程执行的任务。

        3》调用ExecutorService对象的submit()方法来提交Runnable对象或者Callable对象。

        4》当不想提交任何任务时,调用ExecutorService对象的shutdown()方法来关闭线程池。

        举个例子:

    public class ImplCallable implements Callable<Integer>{
    
       ...
       @Override
       public Integer call(){
     
          ...
          //do something
          System.out.println(Thread.currentThread().getName());
          //return a value.
          return 1;
       }
    
        public static void main(String[] agrs) throws InterruptedException, ExecutionException{
    
          ...
    //创建一个具有固定线程数(6)的线程池
    ExecutorService pool=Executors.newFixedThreadPool(6);
    //创建并启动一个线程 FutureTask<Integer> target=new FutureTask<Integer>(new ImplCallable()); //向线程池提交两个线程
    pool.submit(target);
    pool.submit(target);
    //关闭线程池
    pool.shutdown(); } }

    2、Java 8增强的ForkJoinPool

  • 相关阅读:
    包装器
    高级new创建
    野性的呼唤 第三章
    SourceTree的基本使用
    SAP的春天回来么?
    dirname命令和basename命令
    一个简单的ETL脚本的内容
    轮子:读取config.ini文件
    sed基础语法
    hivesql之str_to_map函数
  • 原文地址:https://www.cnblogs.com/ZeroMZ/p/11409913.html
Copyright © 2011-2022 走看看