Java线程池应用

Executors工具类用于创建Java线程池和定时器。

newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。

创建一个固定大小的线程池来执行10个任务:

实例:

 1 ExecutorService threadPool = Executors.newFixedThreadPool(3);
 2         for (int j = 0; j < 10; j++) {
 3             final int task = j;
 4             threadPool.execute(new Runnable() {
 5                 @Override
 6                 public void run() {
 7                     for (int i = 0; i < 10; i++) {
 8                         try {
 9                             Thread.sleep(200);
10                         } catch (InterruptedException e) {
11                             // TODO Auto-generated catch block
12                             e.printStackTrace();
13                         }
14                         System.out.println(Thread.currentThread().getName()+"is looping of "+ i +" task of "+task);
15                     }
16
17                 }
18             });
19         }

newCachedThreadPool 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用 ThreadPoolExecutor 构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。

创建10个线程的缓存池执行10个任务

实例:

 1 ExecutorService threadPool = Executors.newCachedThreadPool();
 2         for (int j = 0; j < 10; j++) {
 3             final int task = j;
 4             threadPool.execute(new Runnable() {
 5                 @Override
 6                 public void run() {
 7                     for (int i = 0; i < 10; i++) {
 8                         try {
 9                             Thread.sleep(200);
10                         } catch (InterruptedException e) {
11                             // TODO Auto-generated catch block
12                             e.printStackTrace();
13                         }
14                         System.out.println(Thread.currentThread().getName()+"is looping of "+ i +" task of "+task);
15                     }
16
17                 }
18             });
19         }

newSingleThreadExecutor 创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的 newFixedThreadPool(1) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。

创建一个线程执行十个任务(可以用于让一个死去线程复活重新执行,实际是启动一个新的线程)

实例:

 1 ExecutorService threadPool = Executors.newSingleThreadExecutor();
 2         for (int j = 0; j < 10; j++) {
 3             final int task = j;
 4             threadPool.execute(new Runnable() {
 5                 @Override
 6                 public void run() {
 7                     for (int i = 0; i < 10; i++) {
 8                         try {
 9                             Thread.sleep(200);
10                         } catch (InterruptedException e) {
11                             // TODO Auto-generated catch block
12                             e.printStackTrace();
13                         }
14                         System.out.println(Thread.currentThread().getName()+"is looping of "+ i +" task of "+task);
15                     }
16
17                 }
18             });
19         }

shutdown和shutdownNow的区别

shutdown:启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用。

shutdownNow:试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。无法保证能够停止正在处理的活动执行任务,但是会尽力尝试。例如,通过 Thread.interrupt() 来取消典型的实现,所以任何任务无法响应中断都可能永远无法终止。

ScheduledExecutorService线程池定时器。schedule 方法使用各种延迟创建任务,并返回一个可用于取消或检查执行的任务对象。scheduleAtFixedRate 和scheduleWithFixedDelay 方法创建并执行某些在取消前一直定期运行的任务。

schedule 创建并执行在给定延迟后启用的一次性操作。

 1 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
 2         for (int i = 0; i < 10; i++) {
 3             final int timer = i;*/
 4             /*scheduledThreadPool.schedule(new Runnable() {
 5                 @Override
 6                 public void run() {
 7                     try {
 8                         Thread.sleep(20);
 9                     } catch (InterruptedException e) {
10                         // TODO Auto-generated catch block
11                         e.printStackTrace();
12                     }
13                     System.out.println(Thread.currentThread().getName()+" " +timer);
14                 }
15             }, 2, TimeUnit.SECONDS);

scheduleAtFixedRate 创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,然后在 initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。如果任务的任何一个执行遇到异常,则后续执行都会被取消。否则,只能通过执行程序的取消或终止方法来终止该任务。如果此任务的任何一个执行要花费比其周期更长的时间,则将推迟后续执行,但不会同时执行。

 1 scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
 2
 3                 @Override
 4                 public void run() {
 5                     try {
 6                         Thread.sleep(20);
 7                     } catch (InterruptedException e) {
 8                         // TODO Auto-generated catch block
 9                         e.printStackTrace();
10                     }
11                     System.out.println(Thread.currentThread().getName());
12                 }
13             }, 2, 3, TimeUnit.SECONDS);

scheduleWithFixedDelay 创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。如果任务的任一执行遇到异常,就会取消后续执行。否则,只能通过执行程序的取消或终止方法来终止该任务。

 1 scheduledThreadPool.scheduleWithFixedDelay(new Runnable() {
 2
 3                 @Override
 4                 public void run() {
 5                     try {
 6                         Thread.sleep(20);
 7                     } catch (InterruptedException e) {
 8                         // TODO Auto-generated catch block
 9                         e.printStackTrace();
10                     }
11                     System.out.println(Thread.currentThread().getName());
12                 }
13             }, 2, 3, TimeUnit.SECONDS);
时间: 2024-10-14 22:27:49

Java线程池应用的相关文章

java线程池

1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? 1 new Thread(new Runnable() { 2 3 @Override 4 public void run() { 5 // TODO Auto-generated method stub 6 } 7 }).start(); 那你就out太多了,new Thread的弊端如下: a. 每次new Thread新建对象性能差. b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过

Java线程池使用说明

Java线程池使用说明 一 简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用.为我们在开发中处理线程的问题提供了非常大的帮助. 二:线程池 线程池的作用: 线程池作用就是限制系统中执行线程的数量.     根 据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少

Java 线程池的原理与实现

最近在学习线程池.内存控制等关于提高程序运行性能方面的编程技术,在网上看到有一哥们写得不错,故和大家一起分享. [分享]Java 线程池的原理与实现 这几天主要是狂看源程序,在弥补了一些以前知识空白的同时,也学会了不少新的知识(比如 NIO),或者称为新技术吧.线程池就是其中之一,一提到线程,我们会想到以前<操作系统>的生产者与消费者,信号量,同步控制等等.一提到池,我们会想到数据库连接池,但是线程池又如何呢? 建议:在阅读本文前,先理一理同步的知识,特别是syncronized同步关键字的用

Java 线程池学习

Reference: <创建Java线程池>[1],<Java线程:新特征-线程池>[2], <Java线程池学习>[3],<线程池ThreadPoolExecutor使用简介>[4],<Java5中的线程池实例讲解>[5],<ThreadPoolExecutor使用和思考>[6] [1]中博主自己通过ThreadGroup实现一个线程池(挺方便理解的),使用的是jdk1.4版本,Jdk1.5版本以上提供了现成的线程池. [2]中介绍

JAVA线程池的分析和使用

http://www.infoq.com/cn/articles/java-threadPool/ 1. 引言 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行.第三:提高线程的可管理性.线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控.但是要做到合理的利用线程池,必须对其原理了如指掌. 2. 线程池

java线程池分析和应用

比较 在前面的一些文章里,我们已经讨论了手工创建和管理线程.在实际应用中我们有的时候也会经常听到线程池这个概念.在这里,我们可以先针对手工创建管理线程和通过线程池来管理做一个比较.通常,我们如果手工创建线程,需要定义线程执行对象,它实现的接口.然后再创建一个线程对象,将我们定义好的对象执行部分装载到线程中.对于线程的创建.结束和结果的获取都需要我们来考虑.如果我们需要用到很多的线程时,对线程的管理就会变得比较困难.我们手工定义线程的方式在时间和空间效率方面会存在着一些不足.比如说我们定义好的线程

Java线程池:ExecutorService,Executors

简单的Java线程池可以从Executors.newFixedThreadPool( int n)获得.此方法返回一个线程容量为n的线程池.然后ExecutorService的execute执行之. 现给出一个示例. package zhangphil.executorservice; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ZhangPhil

JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue .

从Java5开始,Java提供了自己的线程池.每次只执行指定数量的线程,java.util.concurrent.ThreadPoolExecutor 就是这样的线程池.以下是我的学习过程. 首先是构造函数签名如下: [java] view plain copy print ? public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<

Java线程池使用和分析(二) - execute()原理

相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的方法,JDK注释中的描述是“在未来的某一时刻执行命令command”,即向线程池中提交任务,在未来某个时刻执行,提交的任务必须实现Runnable接口,该提交方式不能获取返回值.下面是对execute()方法内部原理的分析,分析前先简单介绍线程池有哪些状态,在一系列执行过程中涉及线程池状态相关的判断