读书人

线程池容易实现

发布时间: 2012-12-26 14:39:29 作者: rapoo

线程池简单实现

其实线程池的实现就是生产者消费者问题的实现,理解了生产者消费者问题就不会对线程池的实现感到神秘了,线程池在很多地方会用到,比如tomcat等各种中间容器的实现,Spring对线程池的支持等,当然mina中也使用到了线程池的概念。

看下简单对线程池的实现代码,主要包括三个类,一个是线程池,一个是工作任务,一个是客户端进行任务添加。

任务类,比较简单,实现Runnable接口:

//任务类,具体要执行的操作  public class Worker implements Runnable {      private int id;      public Worker(int id) {          this.id = id;      }      public void run() {          try {              Thread.sleep(100);          } catch (InterruptedException e) {              e.printStackTrace();          }          System.out.println("线程:" + Thread.currentThread().getName() + " 执行任务" + id);      }  }  
?

线程池,相对复杂一些,但是原理是很简单的:

public class ThreadPool {      // 线程池大小      private final int nThreads;      // 线程池工作者(具体线程)      private final PoolWorker[] threads;      // 任务队列      private final LinkedList<Runnable> queue;      public ThreadPool(int nThreads) {          // 初始线程池,并启动线程池里面的线程          this.nThreads = nThreads;          queue = new LinkedList<Runnable>();          threads = new PoolWorker[nThreads];          for (int i = 0; i < nThreads; i++) {              threads[i] = new PoolWorker();              threads[i].start();          }      }      // 提交工作任务,实际将任务放入队列,并通知线程进行消费      public void execute(Runnable r) {          synchronized (queue) {              queue.addLast(r);              queue.notify();          }      }        private class PoolWorker extends Thread {          public void run() {              Runnable r;              // 循环取出任务队列里的任务进行消费,如果没有任务,就等待任务到来。              while (true) {                  synchronized (queue) {                      while (queue.isEmpty()) {                          try {                              queue.wait();                          } catch (InterruptedException ignored) {                          }                      }                      r = queue.removeFirst();                  }                  try {                      r.run();                  } catch (RuntimeException e) {                  }              }          }      }  }  
?

客户端代码:

public class Client {      public static void main(String[] args) {          ThreadPool queue = new ThreadPool(10);          // 提交工作任务。          queue.execute(new Worker(1));          queue.execute(new Worker(2));          queue.execute(new Worker(3));      }  }  
?

线程池实现其实比较简单的,但是实际应用中我们用线程池比较常见的方式还是使用JDK中对线程池的实现,它提供了ExecutorService,Executor等类实现了对线程池的支持,不过线程池的实现原理其实是和我们的一样的,只不过它更多的考虑了实现细节,功能更强一些,关于它的使用网上有很多文章讲的已经很清楚了,可以参考:http://mshijie.iteye.com/blog/366591

?

?

读书人网 >编程

热点推荐