线程池 Executors 入门

原创 2013年12月04日 10:23:33

系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互。在这种情形下,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存周期很短的线程时,更应该考虑使用线程池。

 

使用线程池可以有效地控制系统中并发线程的数量,当系统中包含大量并发线程时,会导致系统性能剧烈下降,甚至导致JVM崩溃,而线程池的最大线程数参数可以控制系统中并发线程数不超过此数。

 

从JAVA5开始新增了一个Executors工具类来产生线程池,它有如下几个静态工厂方法来创建线程池。

强烈建议程序员使用较为方便的 Executors 工厂方法 Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收)、

Executors.newFixedThreadPool(int)(固定大小线程池)

Executors.newSingleThreadExecutor()(单个后台线程)

Executors.newScheduledThreadPool(int corePoolSize) 可以指定延迟后执行线程任务。

 

ExecutorService代表尽快执行线程的线程池(只要线程池中有空闲的线程,就立即执行线程任务),程序只要将一个Runnable对象或Callable对象(代表线程任务)提交给该线程,该线程就会尽快执行该任务

 

当用完一个线程池后,应该嗲用该线程池的shutdown()方法,该方法将启动线程池的关闭序列,调用shutdown()方法后的线程池不再接受新任务,但将以前所有已提交任务执行完。当线程池中的所有任务都执行完成后,池中的所有线程都会死亡;另外也可以调用线程池中的shutdownNow()方法来关闭线程池,该方法试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行任务列表。

 

package hb.threadpool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class FixedThreadPoolDemo {

	public static void main(String[] args) {
		
		ExecutorService es = Executors.newFixedThreadPool(2);
//		ExecutorService es = Executors.newCachedThreadPool();
		
		for (int i = 0; i < 10; i++) {
			final int count = i;
			//过两秒启动线程运行里面的run方法
			es.submit(new Runnable() {
				@Override
				public void run() {
					System.out.println(Thread.currentThread().getName() + "----------" + count);
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			});
		}
		
		System.out.println(es.isShutdown());
		//等待线程运行完毕之后再停止线程。
		es.shutdown();
		//强制停止线程,如果当前线程正在执行,则被强制停止。
//		es.shutdownNow();
		System.out.println(es.isShutdown());
		
	}

}
 

 

package hb.threadpool;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ScheduledThreadPoolExecutorDemo {

	public static void main(String[] args) {

//		ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor(2);
		ScheduledExecutorService stpe = Executors.newScheduledThreadPool(2);;
		
		for (int i = 0; i < 10; i++) {
			final int count = i;
			//过两秒启动线程运行里面的run方法
			stpe.schedule(new Runnable() {
				@Override
				public void run() {
					System.out.println(Thread.currentThread().getName() + "----------" + count);
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}, 2, TimeUnit.SECONDS);
		}
		
		System.out.println(stpe.isShutdown());
		//等待线程运行完毕之后再停止线程。
		stpe.shutdown();
		//强制停止线程,如果当前线程正在执行,则被强制停止。
//		stpe.shutdownNow();
		System.out.println(stpe.isShutdown());
		

	}

}

 

 

相关文章推荐

Java通过Executors提供四种线程池

Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 new...

Android的线程池:ExecutorService和Executors

ExecutorService是线程池的一个服务,可以随时关闭线程池,是继承Executor的。Executors是个工厂类,专门创建各种线程池。 Android常用的线程池有一下几种,在Execu...
  • infsafe
  • infsafe
  • 2012年05月30日 12:12
  • 1120

线程池.(Executors,ThreadPoolExecutor,BlockingQueue,RejectedExecutionHandler).介绍

线程池 Android里面,耗时的网络操作,都会开子线程,在程序里面直接开过多的线程会消耗过多的资源,在众多的开源框架中也总能看到线程池的踪影,所以线程池是必须要会把握的一个知识点; ...

Executors类中创建线程池的几种方法的分析

Executors类中创建线程池的几种方法的分析要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂...

线程池ThreadPoolExecutor的例子,Executors.newFixedThreadPool实现

通过源码可以看到,本质上,Executors.newSingleThreadExecutor();或者Executors.newFixedThreadPool(args);等等,都是在new Thre...

Java自带的线程池Executors.newFixedThreadPool

线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程...

张孝祥线程池的概念和Executors类的应用(学习笔记)

package cn.javaious.concurrence; import java.util.concurrent.ExecutorService; import java.util.conc...

Java 自带的线程池Executors.newFixedThreadPool

Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线程程序...
  • gshzh00
  • gshzh00
  • 2017年05月19日 10:26
  • 98

java Executors线程池

http://blog.sina.com.cn/s/blog_4b2e0e610100zxwr.html 1. 类 Executors  此类中提供的一些方法有:  1.1 publi...

Executors.newFixedThreadPool(NTHREADS)线程池数量设置多少合适?

并发编程中线程池 是跑不了的, 用过线程池的朋友 都会遇到这样的一个问题: 如何合理地估算线程池大小? 怎么样设置 数量,执行效率最高? 怎么样设置 内存消耗最低? 是不是设置 线程池数量越大...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程池 Executors 入门
举报原因:
原因补充:

(最多只允许输入30个字)