Java编程中线程池的基本概念和使用

 更新时间:2015年11月16日 08:54:20   投稿:goldensun  
这篇文章主要介绍了Java编程中线程池的基本概念和使用,多线程编程是使Java程序实现并发的一个重要手段,需要的朋友可以参考下

1 引入线程池的原因
  由于线程的生命周期中包括创建、就绪、运行、阻塞、销毁阶段,当我们待处理的任务数目较小时,我们可以自己创建几个线程来处理相应的任务,但当有大量的任务时,由于创建、销毁线程需要很大的开销,运用线程池这些问题就大大的缓解了。

2 线程池的使用
  我们只需要运用Executors类给我们提供的静态方法,就可以创建相应的线程池:

  public static ExecutorSevice newSingleThreadExecutor()

  public static ExecutorSevice newFixedThreadPool()

  public static ExecutorSevice newCachedThreadPool()

  newSingleThreadExecutor返回以个包含单线程的Executor,将多个任务交给此Exector时,这个线程处理完一个任务后接着处理下一个任务,若该线程出现异常,将会有一个新的线程来替代。

  newFixedThreadPool返回一个包含指定数目线程的线程池,如果任务数量多于线程数目,那么没有没有执行的任务必须等待,直到有任务完成为止。

  newCachedThreadPool根据用户的任务数创建相应的线程来处理,该线程池不会对线程数目加以限制,完全依赖于JVM能创建线程的数量,可能引起内存不足。

  我们只需要将待执行的任务放入run方法中即可,将Runnable接口的实现类交给线程池的execute方法,作为它的一个参数,如下所示:

Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable(){
  public void run(){
    //执行的任务  
 }
}

  如果需要给任务传递参数,可以通过创建一个Runnable接口的实现类来完成。

3.实例
(1):newSingleThreadExecutor
MyThread.java

publicclassMyThread extends Thread {
  @Override
  publicvoid run() {
    System.out.println(Thread.currentThread().getName() + "正在执行。。。");
  }
}
TestSingleThreadExecutor.java
publicclassTestSingleThreadExecutor {
  publicstaticvoid main(String[] args) {
    //创建一个可重用固定线程数的线程池
    ExecutorService pool = Executors. newSingleThreadExecutor();
    //创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
    Thread t1 = new MyThread();
    Thread t2 = new MyThread();
    Thread t3 = new MyThread();
    Thread t4 = new MyThread();
    Thread t5 = new MyThread();
    //将线程放入池中进行执行
    pool.execute(t1);
    pool.execute(t2);
    pool.execute(t3);
    pool.execute(t4);
    pool.execute(t5);
    //关闭线程池
    pool.shutdown();
  }
}

输出结果

pool-1-thread-1正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-1正在执行。。。

(2):newFixedThreadPool
TestFixedThreadPool.Java

publicclass TestFixedThreadPool {
  publicstaticvoid main(String[] args) {
    //创建一个可重用固定线程数的线程池
    ExecutorService pool = Executors.newFixedThreadPool(2);
    //创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
    Thread t1 = new MyThread();
    Thread t2 = new MyThread();
    Thread t3 = new MyThread();
    Thread t4 = new MyThread();
    Thread t5 = new MyThread();
    //将线程放入池中进行执行
    pool.execute(t1);
    pool.execute(t2);
    pool.execute(t3);
    pool.execute(t4);
    pool.execute(t5);
    //关闭线程池
    pool.shutdown();
  }
}

输出结果

pool-1-thread-1正在执行。。。
pool-1-thread-2正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-2正在执行。。。
pool-1-thread-1正在执行。。。

(3): newCachedThreadPool
TestCachedThreadPool.java

publicclass TestCachedThreadPool {
  publicstaticvoid main(String[] args) {
    //创建一个可重用固定线程数的线程池
    ExecutorService pool = Executors.newCachedThreadPool();
    //创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
    Thread t1 = new MyThread();
    Thread t2 = new MyThread();
    Thread t3 = new MyThread();
    Thread t4 = new MyThread();
    Thread t5 = new MyThread();
    //将线程放入池中进行执行
    pool.execute(t1);
    pool.execute(t2);
    pool.execute(t3);
    pool.execute(t4);
    pool.execute(t5);
    //关闭线程池
    pool.shutdown();
  }
}

输出结果:

pool-1-thread-2正在执行。。。
pool-1-thread-4正在执行。。。
pool-1-thread-3正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-5正在执行。。。

(4):newScheduledThreadPool
TestScheduledThreadPoolExecutor.java

publicclass TestScheduledThreadPoolExecutor {
  publicstaticvoid main(String[] args) {
    ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
    exec.scheduleAtFixedRate(new Runnable() {//每隔一段时间就触发异常
           @Override
           publicvoid run() {
              //throw new RuntimeException();
              System.out.println("================");
           }
         }, 1000, 5000, TimeUnit.MILLISECONDS);
    exec.scheduleAtFixedRate(new Runnable() {//每隔一段时间打印系统时间,证明两者是互不影响的
           @Override
           publicvoid run() {
              System.out.println(System.nanoTime());
           }
         }, 1000, 2000, TimeUnit.MILLISECONDS);
  }
}

输出结果

================
8384644549516
8386643829034
8388643830710
================
8390643851383
8392643879319
8400643939383

相关文章

  • java两个数组合并为一个数组的几种方法

    java两个数组合并为一个数组的几种方法

    这篇文章主要给大家介绍了关于java两个数组合并为一个数组的几种方法,最近在写代码时遇到了需要合并两个数组的需求,文中将每种方法都介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • MyBatis-Plus实现多数据源的示例代码

    MyBatis-Plus实现多数据源的示例代码

    这篇文章主要介绍了MyBatis-Plus实现多数据源的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • java单例五种实现模式解析

    java单例五种实现模式解析

    这篇文章主要介绍了java单例五种实现模式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java随机数算法原理与实现方法实例详解

    Java随机数算法原理与实现方法实例详解

    这篇文章主要介绍了Java随机数算法原理与实现方法,简单分析了随机数算法的原理并结合具体实例形式给出了java编程计算随机数的具体操作技巧,需要的朋友可以参考下
    2017-09-09
  • Java中Objects.equals踩坑记录

    Java中Objects.equals踩坑记录

    最近在工作中发现一个问题,觉着还是挺有必要记录下的,这篇文章主要给大家介绍了关于Java中Objects.equals踩坑的相关资料,需要的朋友可以参考下
    2022-03-03
  • java实现简易的学籍管理系统

    java实现简易的学籍管理系统

    这篇文章主要为大家详细介绍了java实现简易的学籍管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • SpringBoot解决mysql连接8小时问题

    SpringBoot解决mysql连接8小时问题

    服务连接mysql数据库,8小时没有数据库的操作时候,数据库会主动断开连接释放资源,本文就详细的介绍一下解决方法,感兴趣的可以了解一下
    2023-08-08
  • Mybatis之Mapper动态代理实例解析

    Mybatis之Mapper动态代理实例解析

    这篇文章主要介绍了Mybatis之Mapper动态代理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Springboot实现过滤器的两种方式

    Springboot实现过滤器的两种方式

    今天通过本文给大家分享Springboot实现过滤器的两种方式,第一种是spring容器注册filter,第二种方式是通过@WebFilter 注解来配置,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2023-10-10
  • Java中的定时器Timer详解

    Java中的定时器Timer详解

    这篇文章主要为大家详细介绍了Java定时器Timer的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论