转自:http://blog.csdn.net/coding_or_coded/article/details/6856014
Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线程程序,线程部分的新增内容显得尤为重要。
有关Java5线程新特征的内容全部在java.util.concurrent下面,里面包含数目众多的接口和类,熟悉这部分API特征是一项艰难的学习过程。目前有关这方面的资料和书籍都少之又少,大所属介绍线程方面书籍还停留在java5之前的知识层面上。
当然新特征对做多线程程序没有必须的关系,在java5之前通用可以写出很优秀的多线程程序。只是代价不一样而已。
线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。
在Java5之前,要实现一个线程池是相当有难度的,现在Java5为我们做好了一切,我们只需要按照提供的API来使用,即可享受线程池带来的极大便利。
Java5的线程池分好多种:具体的可以分为两类,固定尺寸的线程池、可变尺寸连接池。
在使用线程池之前,必须知道如何去创建一个线程池,在Java5中,需要了解的是java.util.concurrent.Executors类的API,这个类提供大量创建连接池的静态方法,是必须掌握的。
一、固定大小的线程池,newFixedThreadPool:
-
packageapp.executors;
-
-
importjava.util.concurrent.Executors;
-
importjava.util.concurrent.ExecutorService;
-
-
-
-
-
-
-
publicclassTest{
-
publicstaticvoidmain(String[]args){
-
-
ExecutorServicepool=Executors.newFixedThreadPool(5);
-
-
Threadt1=newMyThread();
-
Threadt2=newMyThread();
-
Threadt3=newMyThread();
-
Threadt4=newMyThread();
-
Threadt5=newMyThread();
-
-
pool.execute(t1);
-
pool.execute(t2);
-
pool.execute(t3);
-
pool.execute(t4);
-
pool.execute(t5);
-
-
pool.shutdown();
-
}
-
}
-
-
classMyThreadextendsThread{
-
@Override
-
publicvoidrun(){
-
System.out.println(Thread.currentThread().getName()+"正在执行。。。");
-
}
-
}
输出结果:
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-3正在执行。。。
-
pool-1-thread-4正在执行。。。
-
pool-1-thread-2正在执行。。。
-
pool-1-thread-5正在执行。。。
改变ExecutorService pool = Executors.newFixedThreadPool(5)中的参数:ExecutorService pool = Executors.newFixedThreadPool(2),输出结果是:
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-2正在执行。。。
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-2正在执行。。。
从以上结果可以看出,newFixedThreadPool的参数指定了可以运行的线程的最大数目,超过这个数目的线程加进去以后,不会运行。其次,加入线程池的线程属于托管状态,线程的运行不受加入顺序的影响。
二、单任务线程池,newSingleThreadExecutor:
仅仅是把上述代码中的ExecutorService pool = Executors.newFixedThreadPool(2)改为ExecutorService pool = Executors.newSingleThreadExecutor();
输出结果:
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-1正在执行。。。
可以看出,每次调用execute方法,其实最后都是调用了thread-1的run方法。
三、可变尺寸的线程池,newCachedThreadPool:
与上面的类似,只是改动下pool的创建方式:ExecutorService pool = Executors.newCachedThreadPool();
输出:
-
pool-1-thread-1正在执行。。。
-
pool-1-thread-2正在执行。。。
-
pool-1-thread-4正在执行。。。
-
pool-1-thread-3正在执行。。。
-
pool-1-thread-5正在执行。。。
这种方式的特点是:可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。
四、延迟连接池,newScheduledThreadPool:
-
packageapp.executors;
-
-
importjava.util.concurrent.Executors;
-
importjava.util.concurrent.ScheduledExecutorService;
-
importjava.util.concurrent.TimeUnit;
-
-
-
-
-
-
-
publicclassTest{
-
publicstaticvoidmain(String[]args){
-
-
ScheduledExecutorServicepool=Executors.newScheduledThreadPool(2);
-
-
Threadt1=newMyThread();
-
Threadt2=newMyThread();
-
Threadt3=newMyThread();
-
-
pool.execute(t1);
-
-
pool.schedule(t2,1000,TimeUnit.MILLISECONDS);
-
pool.schedule(t3,10,TimeUnit.MILLISECONDS);
-
-
-
pool.shutdown();
-
}
-
}
-
-
classMyThreadextendsThread{
-
@Override
-
publicvoidrun(){
-
System.out.println(Thread.currentThread().getName()+"正在执行。。。");
-
}
-
}
读者可以尝试改变Executors.newScheduledThreadPool(2)的参数来得到更多的体验,当然,让
-
@Override
-
publicvoidrun(){
-
System.out.println(Thread.currentThread().getName()+"正在执行。。。");
-
}
变成一个无限循环,你可以得到更多的关于pool.shutdown()的用法。
五:单任务延迟连接池(和上面类似,就不写了)。当然我们也可以自定义线程池,这里就不写了,累啊……
shutdown() 方法不会阻塞。调用 shutdown() 方法之后,主线程就马上结束了,而线程池会继续运行直到所有任务执行完才会停止。如果不调用
shutdown() 方法,那么线程池会一直保持下去,以便随时添加新的任务。
分享到:
相关推荐
Java中Executors类中几种创建各类型线程池方法及简单实例
除了`ThreadPoolExecutor`,Java还提供了`Executors`工具类,它提供了一些预设的线程池配置,如`newFixedThreadPool`(固定大小线程池)、`newSingleThreadExecutor`(单线程线程池)等,方便开发者快速创建线程池。...
java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。 2.数据批量导出。 3任务数据异步执行。 4.多线程...
- 使用`Executors`工厂类创建线程池,如`newFixedThreadPool`创建固定大小的线程池,`newCachedThreadPool`创建缓存线程池等。 - 提交任务到线程池,通过`ExecutorService`的`execute`方法将`Runnable`或`Callable...
本文将深入探讨四种常见的Java线程池实例:`ThreadPoolExecutor`、`Executors`提供的固定线程池、单线程池和定时线程池。 1. **ThreadPoolExecutor**: 这是最基础也是最灵活的线程池实现,可以通过`new ...
Java线程池是Java并发编程中的重要组成部分,它在多线程和高并发场景下扮演着关键角色。本文将深入探讨Java线程池的源码分析,并对比不同类型的线程池,以帮助开发者更好地理解和利用这一强大的工具。 首先,我们要...
在Java中,`java.util.concurrent`包下的`ExecutorService`、`ThreadPoolExecutor`和`Executors`类提供了线程池的实现。 消息队列(Message Queue)则是一种异步通信机制,它允许应用程序将消息发送到队列,然后由...
Java线程池是Java并发编程中的重要组件,它能够有效地管理和复用线程,从而提高程序的执行效率和降低资源消耗。在JDK 1.5版本之前,Java对线程池的支持非常有限,而在JDK 1.5之后,加入了java.util.concurrent包,...
### Java内置线程池详解 #### 一、线程池基本概念 在深入探讨Java内置线程池之前,我们首先需要了解线程池的基本概念及其重要性。 **线程池**是一种多线程处理形式,它通过重用预创建的线程来执行任务,而不是为...
Java线程池是一种高级的多线程处理框架,它是Java并发编程中非常重要的一个组件。线程池的原理和实现涉及到操作系统调度、内存管理和并发控制等多个方面。理解线程池的工作原理有助于优化程序性能,避免过度创建和...
在实际开发中,Java还提供了一些预定义的线程池,如`Executors.newFixedThreadPool(int nThreads)`创建固定大小的线程池,`Executors.newSingleThreadExecutor()`创建只有一个线程的线程池等。这些预定义的线程池...
3. Executors工具类:提供静态工厂方法,方便快速创建线程池,如newFixedThreadPool()创建固定大小的线程池,newCachedThreadPool()创建缓存线程池。 四、线程池的工作原理 1. 工作队列:线程池中的任务会先放入...
在Java中,`java.util.concurrent`包下的`ExecutorService`、`ThreadPoolExecutor`和`Executors`类提供了线程池的相关功能。 1. **ExecutorService接口**:这是Java并发框架的核心接口,它定义了创建、管理和执行...
通过调用Executors工具类的newFixedThreadPool方法,创建了一个固定大小的线程池。这个方法会返回一个ThreadPoolExecutor实例,该实例是通过一个工厂方法实现的,这个工厂方法会配置好线程池的各个参数。 ...
Java中的线程池Executors java中的线程池Executors是Java并发编程中的一种重要概念,它提供了一种高效、灵活的线程管理机制。使用线程池可以降低资源消耗,提高响应速度,提高线程的可管理性。 线程池的优点 1. ...
- `Executors`类提供的预定义线程池: - `newFixedThreadPool`:固定大小的线程池,适合执行大量重复性任务。 - `newSingleThreadExecutor`:只有一个线程的线程池,确保任务按顺序执行。 - `...
JAVA 自定义线程池的最大线程数设置方法 JAVA 自定义线程池的最大线程数设置方法是指在创建线程池时,设置线程池的最大线程数,以确保线程池的高效运行。线程池的最大线程数设置方法主要取决于任务的类型,即CPU...
### Java线程池详解 #### 一、线程与线程池的概念 在Java中,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程(例如某个Java应用)至少有一个线程,如果线程...