最近比较无聊,也是快过年了,在家的效率比较低下,两天时间才把这个线程池写出来,基本上没有什么新的知识,只是为了防止手生,也正好是为蓝桥杯软件设计大赛热身,就写了这个比较简单的线程池。
还是有一些小的bug的,比如如果退出程序时,还有工作线程,那么就会造成死锁。还有,线程的最大数量我没有设置上限,如果短时间内有大量的线程产生,效果就像没有线程池一样,标准做法应该是在线程数量达到最大值的时候不再建立新的线程,而是开始不断地分发任务。所以,这些bug还是读者慢慢体会吧。以下是程序:
先是线程池的:
package 线程池1; import java.util.List; import java.util.Vector; public class ThreadPool { private static ThreadPool Instance = null; //定义优先级别,分别放在三个vector中 public final static int LOW_PRIORITY = 0; public final static int NORMAL_PRIORITY = 1; public final static int HIGH_PRIORITY = 2; private final static int THREAD_NUM = 2; //保存空余线程的List private List[] IdleThreads; private boolean isShutDown = false; private int ThreadNUM; //创建的线程数量 private boolean isDebug = false; //singleton模式,所以构造函数为私有 private ThreadPool(){ List[] idleThreads = {new Vector(THREAD_NUM), new Vector<>(THREAD_NUM), new Vector<>(THREAD_NUM)}; IdleThreads = idleThreads; ThreadNUM = 0; } /** * @return 线程的数量 */ public int getThreadNUM() { return ThreadNUM; } /** * @return 返回一个线程池类的实例 */ public static ThreadPool instance() { if (Instance == null) { Instance = new ThreadPool(); System.out.println("ThreadPool:NULL!!!"); } return Instance; } /** * @return 是否输出调试信息 */ public boolean isDebug() { return isDebug; } protected synchronized void repool(PooledThread _repoolingThread){ if (!isShutDown) { if (isDebug) { System.out.println("ThreadPool.repool():repooling..."); } switch (_repoolingThread.getPriority()) { case Thread.MIN_PRIORITY: IdleThreads[LOW_PRIORITY].add(_repoolingThread); break; case Thread.NORM_PRIORITY: IdleThreads[NORMAL_PRIORITY].add(_repoolingThread); break; case Thread.MAX_PRIORITY: IdleThreads[HIGH_PRIORITY].add(_repoolingThread); break; default: throw new IllegalStateException("Illegal Priority found while repooling a thread;"); } notifyAll(); //通知所有线程 }else { if (isDebug) { System.out.println("ThreadPool.repool():Destroying incoming thread..."); } _repoolingThread.shutDown(); if (isDebug) { System.out.println("ThreadPool.recycle():Done."); } } } /** * @param _debug是否输出调试信息 */ public void setDebug(boolean _debug) { isDebug = _debug; } public synchronized void shutDown() { isShutDown = true; if (isDebug) { System.out.println("ThreadPool:Shutting down!..."); } for (int Proindex = 0; Proindex <= HIGH_PRIORITY; Proindex++) { List proThreads = IdleThreads[Proindex]; System.out.println(proThreads.size()); for (int Threadindex = 0; Threadindex < proThreads.size(); Threadindex++) { PooledThread idleThread = (PooledThread) proThreads.get(Threadindex); idleThread.shutDown(); } } notifyAll(); if (isDebug) { System.out.println("ThreadPool:ShutDown Done!"); } } public synchronized void start(Runnable _targetRunnable, int _priority) { PooledThread thread = null; List idleList = IdleThreads[_priority]; if (idleList.size() > 0) { int lastIndex = idleList.size() - 1; thread = (PooledThread)idleList.get(lastIndex); idleList.remove(lastIndex); System.out.println("ThreadPool:remove " + lastIndex); thread.setTarget(_targetRunnable); }else { System.out.println("ADD"); ThreadNUM++; thread = new PooledThread(_targetRunnable, "PooledThread#" + ThreadNUM, this); switch (_priority) { case LOW_PRIORITY: thread.setPriority(Thread.MIN_PRIORITY); if (isDebug) { System.out.println("ThreadPool: add thread Low_Priority"); } break; case NORMAL_PRIORITY: thread.setPriority(Thread.NORM_PRIORITY); if (isDebug) { System.out.println("ThreadPool: add thread Normal_Priority"); } break; case HIGH_PRIORITY: thread.setPriority(Thread.MAX_PRIORITY); if (isDebug) { System.out.println("ThreadPool: add thread High_Priority"); } break; default: thread.setPriority(Thread.NORM_PRIORITY); if (isDebug) { System.out.println("ThreadPool: add thread Normal_Priority"); } break; } thread.start(); if (isDebug) { System.out.println("ThreadPool: Thread Start;"); } } } }
然后是工作线程的:
package 线程池1; public class PooledThread extends Thread{ private ThreadPool threadPool; private Runnable targetRunnable; private boolean isShutdown = false; private boolean isidle = false; private PooledThread(){ super(); } private PooledThread(Runnable _targetRunnable){ super(_targetRunnable); } /** * @param _targetRunnable 一个线程任务 * @param _nameString名称 * @param _threadPool线程池实例 */ public PooledThread(Runnable _targetRunnable, String _nameString, ThreadPool _threadPool) { super(_nameString); threadPool = _threadPool; targetRunnable = _targetRunnable; } private PooledThread(String _nameString) { super(_nameString); } private PooledThread(ThreadGroup _group, Runnable _targetRunnable){ super(_group, _targetRunnable); } private PooledThread(ThreadGroup _group, Runnable _targetRunnable, String _nameString){ super(_group, _targetRunnable, _nameString); } private PooledThread(ThreadGroup _group, String _name) { super(_group, _name); } /** * @return 返回当前状态 */ public boolean isIdled() { return isidle; } public void run() { while (!isShutdown) { isidle = false; if (targetRunnable != null) { targetRunnable.run(); //运行runnable中的代码 } isidle = true; try { threadPool.repool(this); synchronized (this) { wait(); } } catch (Exception e) { e.printStackTrace(); } isidle = false; } System.out.println(this.getName() + ":I am died!"); //循环结束,但是不能让他死亡,否线程池的作用就等于没用 } /** * @param _newRunnable设置一个新的任务 */ public synchronized void setTarget(Runnable _newRunnable) { targetRunnable = _newRunnable; notifyAll(); //唤醒睡眠的线程 } /** * @author mikecoder * @描述 将这个线程关闭 */ public synchronized void shutDown() { isShutdown = true; notifyAll(); } }
最后的就是这个线程池的测试代码:
package 线程池1; public class Main { /** * @param _args 我也不知道用来干什么 * @throws InterruptedException */ public static void main(String[] _args) throws InterruptedException { class TaskRunnable1 implements Runnable{ public void run() { System.out.println("Sleeping 5 sec"); synchronized (this) { try { wait(5000); System.out.println("Hello World!"); } catch (Exception e) { e.printStackTrace(); } } System.out.println("Leaving!..."); } } class TaskRunnable2 implements Runnable{ @Override public void run() { System.out.println("Sleeping 5 sec"); synchronized (this) { try { wait(5000); System.out.println("Hello World Fuck!"); } catch (Exception e) { e.printStackTrace(); } } System.out.println("Leaving!..."); } } System.out.println("ThreadPool Test!..."); ThreadPool threadPool = ThreadPool.instance(); threadPool.setDebug(true); TaskRunnable1 runnable = new TaskRunnable1(); TaskRunnable2 runnable2 = new TaskRunnable2(); for (int i = 0; i < 4; i++) { Thread.sleep(6000); threadPool.start(runnable, ThreadPool.HIGH_PRIORITY); System.out.println(threadPool.getThreadNUM()); } Thread.sleep(10000); threadPool.start(runnable2, ThreadPool.HIGH_PRIORITY); Thread.sleep(10000); threadPool.shutDown(); } }
That’s all.