线程池简介说明
下文是笔者讲述线程池的相关简介说明,如下所示:
通常我们将并发执行的任务传递给一个线程池,让线程池启动新的线程,此时只有当线程池中存在空闲线程时,线程池才会分配一个线程运行
线程池内部任务将被插入一个阻塞队列中,当一个新任务插入到队列中时,一个空闲线程会从队列中取出任务,并运行它
每个通过网络到达服务器的连接都被包装成一个任务并且传递给线程池
线程池的线程会并发的处理连接上的请求
例:
实现一个简单的线程池
线程池的简介
线程池(Thread Pool):用于规定应用程序中同一时刻可运行的线程数,用于管理程序中的线程数通常我们将并发执行的任务传递给一个线程池,让线程池启动新的线程,此时只有当线程池中存在空闲线程时,线程池才会分配一个线程运行
线程池内部任务将被插入一个阻塞队列中,当一个新任务插入到队列中时,一个空闲线程会从队列中取出任务,并运行它
线程池应用场景
线程池常应用在多线程服务器上每个通过网络到达服务器的连接都被包装成一个任务并且传递给线程池
线程池的线程会并发的处理连接上的请求
例:
实现一个简单的线程池
public class ThreadPool { private BlockingQueue taskQueue = null; private list<PoolThread> threads = new ArrayList<PoolThread>(); private boolean isStopped = false; public ThreadPool(int noOfThreads, int maxNoOfTasks) { taskQueue = new BlockingQueue(maxNoOfTasks); for (int i=0; i<noOfThreads; i++) { threads.add(new PoolThread(taskQueue)); } for (PoolThread thread : threads) { thread.start(); } } public void synchronized execute(Runnable task) { if(this.isStopped) throw new IllegalStateException("ThreadPool is stopped"); this.taskQueue.enqueue(task); } public synchronized boolean stop() { this.isStopped = true; for (PoolThread thread : threads) { thread.stop(); } } } public class PoolThread extends Thread { private BlockingQueue<Runnable> taskQueue = null; private boolean isStopped = false; public PoolThread(BlockingQueue<Runnable> queue) { taskQueue = queue; } public void run() { while (!isStopped()) { try { Runnable runnable =taskQueue.take(); runnable.run(); } catch(Exception e) { // 写日志或者报告异常, // 但保持线程池运行. } } } public synchronized void toStop() { isStopped = true; this.interrupt(); // 打断池中线程的 dequeue() 调用 } public synchronized boolean isStopped() { return isStopped; } }
线程池的实现由两部分组成: 类ThreadPool是线程池的公开接口, 而类PoolThread用来实现执行任务的子线程 为了执行一个任务,方法ThreadPool.execute(Runnable r)用 Runnable 的实现作为调用参数 在内部,Runnable 对象被放入阻塞队列 (Blocking Queue),等待着被子线程取出队列。 一个空闲的PoolThread线程会把Runnable对象从队列中取出并执行 你可以在 PoolThread.run() 方法里看到这些代码 执行完毕后PoolThread进入循环并且尝试从队列中再取出一个任务,直到线程终止。 调用 ThreadPool.stop() 方法可以停止ThreadPool 在内部,调用 stop 先会标记 isStopped 成员变量(为 true) 然后,线程池的每一个子线程都调用 PoolThread.stop()方法停止运行 ------------------------------------------------------------------ 注意事项: 当线程池execute()在stop()之后调用execute()方法会抛出IllegalStateException异常 子线程会在完成当前执行的任务后停止 注意PoolThread.stop()方法中调用this.interrupt() 它确保阻塞在 taskQueue.dequeue()里wait()调用的线程能够跳出 wait()调用 并且抛出一个 InterruptedException 异常离开 dequeue() 方法。这个异常在 PoolThread.run() 方法中被截获、报告 然后再检查 isStopped 变量。由于 isStopped 的值是 true, 因此 PoolThread.run() 方法退出,子线程终止
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。