手写线程池(Java)

手动实现线程池

package com.concurrent.pool;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class MySelfThreadPool {
	 //默认线程池中的线程的数量
	 private static final int WORK_NUM = 5;
	 //默认处理任务的数量
	 private static final int TASK_NUM = 100;
	 private int workNum;//线程数量
	 private int taskNum;//任务数量
	 private final Set<WorkThread> workThreads;//保存线程的集合
	 private final BlockingQueue<Runnable> taskQueue;//阻塞有序队列存放任务
	 public MySelfThreadPool() {
	 	this(WORK_NUM, TASK_NUM);
	 }
	 public MySelfThreadPool(int workNum, int taskNum) {
		 if (workNum <= 0) workNum = WORK_NUM;
		 if (taskNum <= 0) taskNum = TASK_NUM;
		 taskQueue = new ArrayBlockingQueue<>(taskNum);
		 this.workNum = workNum;
		 this.taskNum = taskNum;
		 workThreads = new HashSet<>();
		 //启动一定数量的线程数,从队列中获取任务处理
		 for (int i=0;i<workNum;i++) {
			 WorkThread workThread = new WorkThread("thead_"+i);
			 workThread.start();
			 workThreads.add(workThread);
		 }
	 }
	 public void execute(Runnable task) {
		 try {
		 	taskQueue.put(task);
		 } catch (InterruptedException e) {
		 	// TODO Auto-generated catch block
		 	e.printStackTrace();
		 }
	 }
	 public void destroy() {
		 System.out.println("ready close thread pool...");
		 if (workThreads == null || workThreads.isEmpty()) return ;
		 for (WorkThread workThread : workThreads) {
		 	workThread.stopWork();
		 	workThread = null;//help gc
		 }
		 workThreads.clear();
	 }
	 private class WorkThread extends Thread{
		 public WorkThread(String name) {
		 	super();
		 	setName(name);
		 }
		 @Override
		 public void run() {
		 while (!interrupted()) {
		 	try {
		 			Runnable runnable = taskQueue.take();//获取任务
		 			if (runnable !=null) {
		 				System.out.println(getName()+" readyexecute:"+runnable.toString());
		 				runnable.run();//执行任务
		 			}
		 			runnable = null;//help gc
		 		} catch (Exception e) {
		 			interrupt();
		 			e.printStackTrace();
		 		}
		 	}
		 }
		 public void stopWork() {
		 	interrupt();
		 }
	 }
}
	
package com.concurrent.pool;
public class TestMySelfThreadPool {
	 private static final int TASK_NUM = 50;//任务的个数
	 public static void main(String[] args) {
	 	MySelfThreadPool myPool = new MySelfThreadPool(3,50);
	 	for (int i=0;i<TASK_NUM;i++) {
	 		myPool.execute(new MyTask("task_"+i));
	 	}
	}
	static class MyTask implements Runnable{
		 private String name;
		 public MyTask(String name) {
		 	this.name = name;
		 }
		 public String getName() {
		 	return name;
		 }
		 public void setName(String name) {
		 	this.name = name;
		 }
		 @Override
		 public void run() {
			 try {
			 	Thread.sleep(1000);
			 } catch (InterruptedException e) {
			 	// TODO Auto-generated catch block
			 	e.printStackTrace();
			 }
			 System.out.println("task :"+name+" end...");
		 }
		 @Override
		 public String toString() {
			 // TODO Auto-generated method stub
			 return "name = "+name;
		}
	 }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值