JDK5新特性之线程池(一)

一. 线程池的概念:

其实到目前为止我们接触过很多关于池的概念:string池、连接池,之所以要用这个池,目的只有一个:资源的重复使用。

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

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

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

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

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

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

2. 创建缓存线程池

ExecutorService threadPool = Executors.newCachedThreadPool();

3. 创建单一线程池

ExecutorService threadPool = Executors.newSingleThreadExecutor();

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() + " is looping 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);

	}
}

时间: 2024-10-10 06:37:17

JDK5新特性之线程池(一)的相关文章

JDK5新特性之线程同步工具类(三)

一. Semaphore实现信号灯 Semaphore可以控制同时访问资源的线程个数, 例如: 实现一个文件允许的并发访问数. Semaphore实现的功能就类似厕所有5个坑, 加入有十个人要上厕所, 那么同时只能有5个人能够占用, 当5个人中的任何一个人离开后, 其中在等待的另外5个人中就有一个可以占用了. 另外等待的5个人中可以是随机获得优先机会, 也可以使按照先来后到的顺序获得机会, 这取决于构造Semaphore对象时传入的参数选项. /** * Semaphore:信号灯 */ pub

JDK5新特性之线程锁技术(二)

一. Lock实现线程同步互斥 Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也是一个对象. 两个线程执行的代码片段要实现同步互斥的效果,他们必须用同一个Lock对象.锁是上在代表要操作的资源的类的内部方法中, 而不是线程代码中. public class LockTest { public static void main(String[] args) { new LockTest().init(); } private void init() {

JDK5新特性之线程同步集合(五)

一. 传统集合: 传统方式下的Collection在迭代集合时, 不同意对集合进行改动: public class CollectionModifyExceptionTest { public static void main(String[] args) { Collection<String> list = new ArrayList<String>(); list.add("aaa"); list.add("bbb"); list.ad

Java API —— JDK5新特性

JDK5新特性 自动拆装箱.泛型.增强for.静态导入.可变参数.枚举   1.增强for概述 1)简化数组和Collection集合的遍历 2)格式: for(元素数据类型 变量 : 数组或者Collection集合) { 使用变量即可,该变量就是元素 } 3)好处:简化遍历 4)注意事项:增强for的目标要判断是否为null 例子1: package jdk5; import java.util.ArrayList; import java.util.List; /** * Created

JDK5新特性之 可变参数的方法

可变参数的方法:不知道这个方法该定义多少个参数 注意: > 参数实际上是数组 > 必须写在参数列表最后一个 package cn.itcast.day24.varparam; import java.lang.reflect.Type; /** * * JDK5新特性之 可变参数 * 定义方法时,不知道该定义多少个参数 * * 格式: * 修饰符 方法返回值 方法名(数据类型 ... 变量名){} * * 注意: * 可变参数实际上是一个数组 * 可变参数必须写在方法的参数列表的最后 * */

泛型,JDK5新特性,List集合子实现类,Map集合,Set/TreeSet集合,asList

一.泛型(JDK5以后新特性) 1.概述:泛型直接规定集合的存储类型,将明确的集合类型的工作推迟到了创建对象或者调用方法的时候,属于一种参数化类型,可作参数传递.2.优点(1)将运行时期异常提前到了编译时期:(2)优化了设计,解决了×××警告线问题:(3)避免了强制类型转换, ,解决了向下类型转换出现的问题ClassCastException:(4)泛型的引出可以提供程序的安全性.3.泛型定义在类上(1)格式:public class 类名<T>{--}(2)实例:实体类: 测试类: 4.泛型

java 基础加强(myeclipse,debug,junit,JDK5新特性,反射)

思维导图 1.myeclipse的安装和使用 *eclipse:是一个免费的开发工具 *myeclipse:是一个收费的插件,破解myeclipse, **安装目录的要求: 不能有中文和空格 **安装完成之后,选择一个工作空间 ,这个工作空间不能有中文和空格 *破解myeclipse **运行run.bat文件,但是运行之前,必须要安装jdk,通过配置环境变量 *myeclipse的使用 *创建一个工程 -类型 javaproject  web  project -选择依赖的jdk,可以使用my

Java多线程的三大特性,线程池,JMM(Java内存模型)

一,线程的三大特性:原子性.可见性.有序性 1)原子性,即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行.原子性其实就是保证数据一致.线程安全一部分. 2)可见性,即当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值. 3)有序性,即程序执行的顺序按照代码的先后顺序执行.二.JAVA多线程的内存模型 共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见.从抽象的角度来看,

JDK5新特性之阻塞队列(四)

一. 阻塞队列和普通队列: 队列是一种基本的数据类型,其典型特征是先进先出. 阻塞队列和普通队列的区别在于: 当队列为空时,从队列中获取元素的线程会被阻塞,直到其他的线程往空的队列里插入新的元素: 当队列是满的时,往队列里添加元素的操作会被阻塞,直到其他的线程从队列移除一个或多个元素: 上图中:线程1往阻塞队列里添加元素,而线程2从阻塞队列里移除元素 /** * 阻塞队列的简单实现 */ public class BlockingQueue<T> { private List<T>