Java-多线程第四篇线程池

摘要:
线程池将启动线程以执行其run()或call()方法,并等待下一个可运行对象的run()和call()的执行。ScheduledExecutorService表示一个线程池,它可以在指定时间延迟或定期执行线程任务。您应该调用此线程池的shutdown()方法。调用此方法后,线程池将不再接收新任务。调用线程池的shutdownNow()方法关闭线程池。

1、什么是线程池。

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

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

Java-多线程第四篇线程池第1张

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

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

   Java-多线程第四篇线程池第2张

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

   Java-多线程第四篇线程池第3张

   用完一个线程池后,应该调用该线程池的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

免责声明:文章转载自《Java-多线程第四篇线程池》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ubuntu下qemu环境搭建vexpress开发平台SQL字符串处理函数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Preference 使用详解

极力推荐文章:欢迎收藏Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容: Perference 简介 Perference 使用方法 使用XML定义Preference 使用Fragment 定义Preference...

Java多线程 开发中避免死锁的八种方法

1. 设置超时时间 使用JUC包中的Lock接口提供的tryLock方法.该方法在获取锁的时候, 可以设置超时时间, 如果超过了这个时间还没拿到这把锁, 那么就可以做其他的事情, 而不是像synchronized如果没有拿到锁会一直等待下去. boolean tryLock ( long time , T...

python网络编程——IO多路复用之select

1 IO多路复用的概念         原生socket客户端在与服务端建立连接时,即服务端调用accept方法时是阻塞的,同时服务端和客户端在收发数据(调用recv、send、sendall)时也是阻塞的。原生socket服务端在同一时刻只能处理一个客户端请求,即服务端不能同时与多个客户端进行通信,实现并发,导致服务端资源闲置(此时服务端只占据 I/O,...

如何使用JDK自带工具JConsole

前言 jconsole.exe为jdk自带的监控工具,操作简便,比较容易上手。jconsole可以实时的监控Java程序在运行过程中的内存,cpu,线程的使用情况,并可以对加载的相关类进行分析。下面开始一起看看如何使用jconsole吧! 打开jconsole步骤: 1、首先进入到jdk的安装目录bin目录下;双击“jconsole.exe”打开jcons...

008-多线程-基础-ThreadGroup线程组

线程组ThreadGroup表示一组线程的集合,一旦一个线程归属到一个线程组之中后,就不能再更换其所在的线程组。那么为什么要使用线程组呢?个人认为有以下的好处:方便统一管理,线程组可以进行复制,快速定位到一个线程,统一进行异常设置等。ThreadGroup它其实并不属于Java并发包中的内容,它是java.lang中的内容。但是掌握对其的于理解,在实际应用...

libcurl多线程超时设置不安全

from http://blog.csdn.net/sctq8888/article/details/10031219 (1), 超时(timeout) libcurl 是 一个很不错的库,支持http,ftp等很多的协议。使用库最大的心得就是,不仔细看文档,仅仅看着例子就写程序,是一件危险的事情。我的程序崩溃了,我 怀疑是自己代码写的问题,后来发现是库没...