开发自定义线程池

每一个线程的启动和结束都是比较消耗时间和占用资源的。 

如果在系统中用到了很多的线程,大量的启动和结束动作会导致系统的性能变卡,响应变慢。 

为了解决这个问题,引入线程池这种设计思想。 

线程池的模式很像生产者消费者模式,消费的对象是一个一个的能够运行的任务。


设计思路:

1. 准备一个任务容器
2. 在线程池类初始化时,一次性启动10个消费者线程
3. 刚开始任务容器是空的,所以所有的线程处于 wait状态
4. 当一个外部线程添加到任务容器中,就会有一个消费者线程被唤醒notify
5. 这个消费者线程获得容器中的外部线程,并且执行这个任务,执行完毕后,继续等待下一个外部线程的到来。
6. 如果短时间内,有较多的外部线程加入,那么就会有多个线程被唤醒,去执行这些外部线程。

在整个过程中,都不需要创建新的线程,而是循环使用这些已经存在的线程。

线程池类:

import java.util.LinkedList;

public class ThreadPool {

	//线程池大小
	int threadPoolSize;
	//容器
	LinkedList tasks = new LinkedList();
	
	public ThreadPool() {
		threadPoolSize = 10;
		
		//启动10个线程
		synchronized (tasks) {
			for(int i=0;i

测试类:

public class TestThread {

	public static void main(String[] args){
		
		ThreadPool threadPool = new ThreadPool();
		
		for(int i=0;i<25;i++){
			final int j = i;
			//匿名内部类
			Runnable task = new Runnable() {
				@Override
				public void run() {
					System.out.println("working in "+j);
					
					try {
						Thread.sleep(10000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					System.out.println("work accompletion in "+j);
				}
			};
			threadPool.add(task);
			
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

测试结果:

启动: 任务消费者线程 2
启动: 任务消费者线程 0
启动: 任务消费者线程 1
启动: 任务消费者线程 4
启动: 任务消费者线程 5
启动: 任务消费者线程 6
启动: 任务消费者线程 3
启动: 任务消费者线程 9
启动: 任务消费者线程 8
启动: 任务消费者线程 7
任务消费者线程 7 获取到任务,并执行
working in 0
任务消费者线程 5 获取到任务,并执行
working in 1
任务消费者线程 8 获取到任务,并执行
working in 2
任务消费者线程 4 获取到任务,并执行
working in 3
任务消费者线程 9 获取到任务,并执行
working in 4
任务消费者线程 6 获取到任务,并执行
working in 5
任务消费者线程 1 获取到任务,并执行
working in 6
任务消费者线程 2 获取到任务,并执行
working in 7
任务消费者线程 0 获取到任务,并执行
working in 8
任务消费者线程 3 获取到任务,并执行
working in 9
work accompletion in 0
任务消费者线程 7 获取到任务,并执行
working in 10
work accompletion in 1
任务消费者线程 5 获取到任务,并执行
working in 11
work accompletion in 2
任务消费者线程 8 获取到任务,并执行
working in 12
work accompletion in 3
任务消费者线程 4 获取到任务,并执行
working in 13
work accompletion in 4
任务消费者线程 9 获取到任务,并执行
working in 14
work accompletion in 5
任务消费者线程 6 获取到任务,并执行
working in 15
work accompletion in 6
任务消费者线程 1 获取到任务,并执行
working in 16
work accompletion in 7
任务消费者线程 2 获取到任务,并执行
working in 17
work accompletion in 8
任务消费者线程 0 获取到任务,并执行
working in 18
work accompletion in 9
任务消费者线程 3 获取到任务,并执行
working in 19
work accompletion in 10
任务消费者线程 7 获取到任务,并执行
working in 20
work accompletion in 11
任务消费者线程 5 获取到任务,并执行
working in 21
work accompletion in 12
任务消费者线程 8 获取到任务,并执行
working in 22
work accompletion in 13
任务消费者线程 4 获取到任务,并执行
working in 23
work accompletion in 14
任务消费者线程 9 获取到任务,并执行
working in 24
work accompletion in 15
work accompletion in 16
work accompletion in 17
work accompletion in 18
work accompletion in 19
work accompletion in 20
work accompletion in 21
work accompletion in 22
work accompletion in 23
work accompletion in 24


你可能感兴趣的:(Java,线程池,多线程,java,练习,多线程)