JDK5新特性之线程池(一)

一. 线程池的概念:

其实到目前为止我们接触过很多关于池的概念:string池、连接池,之所以要用这个池,目的如下:

1. 降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

2. 提高响应速度,当任务到达时,任务可以不需要等到线程创建就能立刻执行

3. 提高线程的可管理性,线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性。


线程池:首先创建一些线程,当服务器接收到一个客户请求后,就从线程池中取出一个空闲的线程为之服务,服务完后并不关闭该线程,而是将该线程还回到线程池中。

在线程池的编程模式下,任务是提交给整个线程池的,而不是直接交给某个线程,线程池在拿到任务后,它就在内部找有无空闲的线程,找到后再把任务交给内部某个空闲的线程,这就是封装。记住:任务是提交给整个线程池的,一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务。


二. 线程池的创建与关闭:

可以创建三种不同的线程池:

1. 创建固定大小的线程池

ExecutorService threadPool = Executors.newFixedThreadPool(3);  // 线程数为3

2. 创建缓存线程池

ExecutorService threadPool = Executors.newCachedThreadPool();

3. 创建单一线程池:线程死后又会重新创建一个新的

ExecutorService threadPool = Executors.newSingleThreadExecutor();

Executors是一个线程池工厂,各种类型的线程池都是通过它来实现。

public class ThreadPoolTest {

	public static void main(String[] args) {
		ExecutorService threadPool = Executors.newSingleThreadExecutor();
		for (int i = 1; i <= 10; i++) {
			final int task = i;
			threadPool.execute(new Runnable() {
				@Override
				public void run() {
					for (int j = 1; j <= 10; j++) {
						try {
							Thread.sleep(20);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
				       System.out.println(Thread.currentThread().getName() + " loop of " + j + " for task of " + task);
					}
				}
			});
		}
		System.out.println("all of 10 takes have committed!!");
		threadPool.shutdown();  
	}
}

关闭线程池:

threadPool.shutdown()   所有任务完成就结束线程

threadPool.shutdownNow() 马上结束线程


三. 用线程池启动定时器:

支持间隔重复任务的定时方式,不直接支持绝对定时方式,需要转换成相对时间方式:

public class TimerTest {
	public static void main(String[] args) {
		// 只爆炸一次的炸弹  
		Executors.newScheduledThreadPool(3).schedule(new Runnable() {
			@Override
			public void run() {
				System.out.println("bombing!!!");
			}
		}, 4, TimeUnit.SECONDS);

		// 会爆炸多次的连环炸弹  
		// 隔4秒炸一下,隔2秒再炸  
		Executors.newScheduledThreadPool(3).scheduleAtFixedRate(new Runnable() {
			@Override
			public void run() {
				System.out.println("bombings!!!");
			}
		}, 4, 2, TimeUnit.SECONDS);
		
	}
}



你可能感兴趣的:(JDK5新特性之线程池(一))