在Java中,如果每个请求到达就会创建一个新线程,开销是相当大的。
线程池就是来解决生命周期开销问题和资源不足问题。通过多任务重复使用线程,线程创建的开销被分摊到多个任务上,而且由于在请求到达前时线程已经存在,所以消除了线程创建所带来的延迟。这样,就可以立即为请求服务,是应用程序响应更快。
通过适当的调整线程中的线程数目,可以防止资源不足的情况。
当服务器接受到大量短小的请求时,使用线程池技术是非常合适的,他可以大大减少线程的创建和销毁次数,提高服务器的工作效率。
一个比较简单线程池应该包括:
线程池管理器:
创建、销毁并管理线程池,将工作线程放入池中
工作线程:
一个可以循环执行任务的线程,在没有任务时进行等待
任务队列:
提供一种缓冲机制,将没有处理的任务放在任务队列中
任务接口:
每个任务必须实现的接口,主要用来规定任务的入口、任务执行完后的收尾工作、任务的执行状态等,工作线程通过该接口调度任务的执行
简易线程池代码:
1 package com.chinasofti.executor; 2 3 public class ExecutorThread extends Thread { 4 // 创建一个属性表示是否运行项目 5 boolean isRunning = false; 6 // 创建一个Runnable接口表示执行的方法 7 private Runnable run; 8 9 public synchronized void setRunning(boolean running) { 10 isRunning = running; 11 // 如果运行项目运行 那么就唤醒线程 12 if(isRunning){ 13 this.notify(); 14 } 15 } 16 17 public boolean isRunning() { 18 return isRunning; 19 } 20 21 public Runnable getRun() { 22 return run; 23 } 24 25 public void setRun(Runnable run) { 26 this.run = run; 27 } 28 29 @Override 30 public synchronized void run() { 31 while (true){ 32 // 如果项目运行 就执行规定的方法 33 if(isRunning){ 34 this.run.run(); 35 isRunning = false; 36 // 否则就继续等待 37 }else { 38 try { 39 this.wait(); 40 } catch (InterruptedException e) { 41 e.printStackTrace(); 42 } 43 } 44 } 45 } 46 }