Java 线程池简单例子使用说明

注:处理机制

   当一个任务通过execute(Runnable)方法欲添加到线程池时:
   如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
   如果此时线程池中的数量等于corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
   如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
   如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
   处理任务的多时:
   核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
   处理任务的少时:
   当线程池中的线程数量大于corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

二、步骤(代码)

 

 代码如下 复制代码

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
* 线程池例子
*
* @author Msquirrel
*
*/
public class TestThreadPoolExecutor {

   public static void main(String arg[]) {

       // BlockingQueue<Runnable> bq = new LinkedBlockingQueue<Runnable>();
       // ThreadPoolExecutor tpe = new ThreadPoolExecutor(3, 6, 1,
       // TimeUnit.DAYS,bq);
       /**
        * 第一参数:指的是保留的线程池大小。
        * 第二参数:指的是线程池的最大大小。
        * 第三参数:线程池维护线程所允许的空闲时间。
        * 第四参数: 线程池维护线程所允许的空闲时间的单位。
        * 第五参数: 表示存放任务的队列。 
        * 第六参数: 线程池对拒绝任务的处理策略,默认值ThreadPoolExecutor.AbortPolicy()。
        */
       ThreadPoolExecutor tpe = new ThreadPoolExecutor(3, 6, 1, TimeUnit.DAYS,
               new LinkedBlockingQueue<Runnable>(),  new ThreadPoolExecutor.DiscardOldestPolicy());

       /**
        * 循环加线程
        */
       for (int i = 0; i < 20; i++) {
           // 把线程加到线程容器里
           tpe.execute(new Runnable() {

               @Override
               public void run() {
                   // TODO Auto-generated method stub
                   try {
                       // 睡眠1秒钟
                       Thread.sleep(1000);
                   } catch (InterruptedException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                   }

                   System.out.println(String.format("thread %d finished",
                           this.hashCode()));
               }
           });
       }

       /**
        * 调用shutdown() 方法之后,主线程就马上结束了,而线程池会继续运行直到所有任务执行完才会停止。如果不调用 shutdown()
        * 方法,那么线程池会一直保持下去,以便随时添加新的任务。(shutdown() 方法不会阻塞)
        */
       tpe.shutdown();
   }

}

时间: 2024-09-28 13:53:17

Java 线程池简单例子使用说明的相关文章

java线程池简单实例

多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.但如果对多线程应用不当,会增加对单个任务的处理时间.可以举一个简单的例子: 假设在一台服务器完成一项任务的时间为T       T1 创建线程的时间        T2 在线程中执行任务的时间,包括线程间同步所需时间        T3 线程销毁的时间   显然T = T1+T2+T3.注意这是一个极度简化的假设. 可以看出T1,T3是多线程本身的带来的开销,我们渴望减少T1,T3所用

Java线程池的几种实现方法及常见问题解答_java

工作中,经常会涉及到线程.比如有些任务,经常会交与线程去异步执行.抑或服务端程序为每个请求单独建立一个线程处理任务.线程之外的,比如我们用的数据库连接.这些创建销毁或者打开关闭的操作,非常影响系统性能.所以,"池"的用处就凸显出来了. 1. 为什么要使用线程池 在3.6.1节介绍的实现方式中,对每个客户都分配一个新的工作线程.当工作线程与客户通信结束,这个线程就被销毁.这种实现方式有以下不足之处: •服务器创建和销毁工作的开销( 包括所花费的时间和系统资源 )很大.这一项不用解释,可以

Java线程池的几种实现方法和区别介绍_java

Java线程池的几种实现方法和区别介绍 import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.E

Java线程池例子

在做很多高并发应用的时候,单线程的瓶颈已经满足不了我们的需求,此时使用多线程来提高处理速度已经是比较常规的方案了.在使用多线程的时候,我们可以使用线程池来管理我们的线程,至于使用线程池的优点就不多说了. 对于多线程的线程安全处理,这个也非常重要,有些同学还是要多补补课. Java线程池说起来也简单,简单说下继承关系: ThreadPoolExecutor extends AbstractExecutorService implements ExecutorService extends Exec

Java 线程池的原理与实现

这几天主要是狂看源程序,在弥补了一些以前知识空白的同时,也学会了不少新的知识(比如 NIO),或者称为新技术吧.线程池就是其中之一,一提到线程,我们会想到以前<操作系统>的生产者与消费者,信号量,同步控制等等.一提到池,我们会想到数据库连接池,但是线程池又如何呢? 建议:在阅读本文前,先理一理同步的知识,特别是syncronized同步关键字的用法.关于我对同步的认识,要缘于大三年的一本书,书名好像是 Java 实战,这本书写得实在太妙了,真正的从理论到实践,从截图分析到.class字节码分析

Java线程池入门

在做很多高并发应用的时候,单线程的瓶颈已经满足不了我们的需求,此时使用多线程来提高处理速度已经是比较常规的方案了.在使用多线程的时候,我们可以使用线程池来管理我们的线程,至于使用线程池的优点就不多说了. 对于多线程的线程安全处理,这个也非常重要,有些同学还是要多补补课. Java线程池说起来也简单,简单说下继承关系: ThreadPoolExecutor extends AbstractExecutorService implements ExecutorService extends Exec

java 线程池中如何自定义每个线程名称

问题描述 java 线程池中如何自定义每个线程名称 **java 线程池中如何自定义每个线程名称 java 线程池中如何自定义每个线程名称 ** 解决方案 补充下,线程池的创建线程池对象时,有一个参数是ThreadFactory类型,如果不传递,默认用的是DefaultFactory,我们可以自定义一个ThreadFactory然后作为参数传到进去,这个类里面就可以自定义线程池中创建的线程的名称.api: public ThreadPoolExecutor(int corePoolSize,in

Java线程池 ExecutorService

本篇主要涉及到的是java.util.concurrent包中的ExecutorService.ExecutorService就是Java中对线程池的实现. 一.ExecutorService介绍 ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法: Java API对ExecutorService接口的实现有两个,所以这两个即是Java线程池具体实现类(详细了解这两个实现类,点击这里):

Java线程池类ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类

Java中的线程池类有两个,分别是:ThreadPoolExecutor和ScheduledThreadPoolExecutor,这两个类都继承自ExecutorService.利用这两个类,可以创建各种不同的Java线程池,为了方便我们创建线程池,Java API提供了Executors工厂类来帮助我们创建各种各样的线程池.下面我们分别介绍一下这三个类. Java线程池ExecutorService继承树: 一.ThreadPoolExecutor ThreadPoolExecutor是Exe