一个线程池的最小实现

     在消息中间件的实现中,为了提高客户端和服务器端通信的效率以及提高资源的利用率,利用线程池是必不可少的一环.

     下面我们简单介绍下线程池的实现方式,线程池的实现主要由以下部分组成:

     1.任务接口:要让线程去执行的代码段应该用任务接口定义好

     2.任务队列:在任务队列中保存了所有将要执行的任务

     3.工作线程:工作线程继承自Thread类或实现Runnable接口,在此类中持有任务队列的引用,在run方法中具体去执行某个任务,如果此时任务队列为空,则等待新任务去唤醒

     4.线程池管理器:此类中完成线程的初始化,启动,添加任务以及其他一些相关操作.该类持有任务队列的引用以及开启的线程的引用

    下面我们看看实现代码:

    (1)任务接口 

package com.liu.threadpool;

/*
 * 任务接口
 */
public interface Task {

	//执行任务的入口
	public void execute();
}

   (2)任务接口的具体实现类 

package com.liu.threadpool;

/*
 * 任务接口的实现类
 */
public class TaskImpl implements Task {

	public void execute() 
	{
		System.out.println(Thread.currentThread().getName()+"--->");
	}
}

   (3)工作线程

package com.liu.threadpool;

import java.util.List;

/*
 * 工作线程
 */
public class WorkThread extends Thread {

	//任务队列
	private List<Task> list;
	//开关变量,用于结束线程(true:关闭线程 false:不关闭线程)
	private boolean shutdown;
	
	public WorkThread(List<Task> list)
	{
		this.list=list;
		this.shutdown=false;
	}
	
	public void run()
	{
		while(!shutdown)
		{
			synchronized(list)
			{
				//任务队列非空,则执行任务			
				if(!list.isEmpty())
				{
					Task task=list.remove(0);
					task.execute();
				}
				//任务队列为空,线程暂停执行,等待有新的任务到来
				else
				{
					try 
					{
						list.wait();
					}
					catch (InterruptedException e) 
					{
						e.printStackTrace();
					}
				}
			}
		}
	}
	
	public void closeThread()
	{
		this.shutdown=true;
	}
}

   (4)线程池管理器

package com.liu.threadpool;

import java.util.ArrayList;
import java.util.List;

/*
 * 线程池管理器
 */
public class ThreadManager {
	
	//初始化线程池中线程的个数
	private int size=3;
	//任务队列
	private List<Task> tasklist;
	//保存开启线程的引用
	private List<WorkThread> threadlist;
	
	public ThreadManager(int size)
	{
		if(size>0)this.size=size;
		tasklist=new ArrayList<Task>();
		threadlist=new ArrayList<WorkThread>();
		start();
	}
	
	/*
	 * 开启指定数目的线程,并放入线程池中进行管理
	 */
	public void start()
	{
		synchronized(tasklist)
		{
			for(int i=0;i<this.size;i++)
			{
				WorkThread thread=new WorkThread(tasklist);
				threadlist.add(thread);
				thread.start();
			}
		}
	}
	
	/*
	 * 添加工作任务
	 */
	public void addTask(Task task)
	{
		synchronized(tasklist)
		{
			tasklist.add(task);
			tasklist.notifyAll();
		}
	}
	
	/*
	 * 停止第i个线程
	 */
	public void stop(int i)
	{
		synchronized(tasklist)
		{
			threadlist.get(i).closeThread();
			threadlist.remove(i);
		}
	}
}

   (5)测试用例

package com.liu.threadpool;

public class ThreadPoolTest {

	public static void main(String[] args) 
	{
		ThreadManager manager=new ThreadManager(3);
		Task t1=new TaskImpl();
		Task t2=new TaskImpl();
		Task t3=new TaskImpl();
		Task t4=new TaskImpl();
		Task t5=new TaskImpl();
		Task t6=new TaskImpl();
		Task t7=new TaskImpl();
		Task t8=new TaskImpl();
		Task t9=new TaskImpl();
		manager.addTask(t1);
		manager.addTask(t2);
		manager.addTask(t3);
		
		try 
		{
			Thread.currentThread().sleep(3000);
		} 
		catch (InterruptedException e) 
		{
			e.printStackTrace();
		}
		manager.stop(0);
		
		manager.addTask(t4);
		manager.addTask(t5);
		manager.addTask(t6);
		manager.addTask(t7);
		manager.addTask(t8);
		manager.addTask(t9);
		
		manager.stop(0);
		manager.stop(0);
	}
}

 

 

  

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值