线程池 Executors

时间 2019/6/25 22:03:25 加载中...

线程池

服务器端程序,比如Web服务器或数据库,要处理大量的客户端请求。
每个请求都会由一个线程来处理。如果我们每次都是创建新线程的话,
那资源大多会消耗在线程的创建和销毁上,而不是处理客户端请求。

线程的创建和销毁是很消耗系统资源的。

所以,我们要重用线程,而不是每次都去创建。

线程池,通俗的理解就是存放线程的池子,假设线程池里面有5个线程。当有任务来时,
就会交给线程池中的某个线程来处理。再来其它任务时,再交给其它空闲的线程处理。

当线程把任务处理完,就会回归到线程池,等待其它任务。这样的话,就实现了线程的复用。

Executors

Executors类 位于 java.util.concurrent 包下面,提供了创建线程池的方法。

static ExecutorService newFixedThreadPool(int nThreads)
创建指定大小的线程池

static ExecutorService newCachedThreadPool()
在需要的时候才创建线程

static ExecutorService newSingleThreadExecutor()
只创建一个线程

对于固定大小的线程池,如果所有的线程都在运行的话,那么挂起的任务就会放在队列中。
当有线程空闲的时候,任务才会被执行。

举例

我们来创建一个固定大小的线程池,来演示它处理任务的情况。

  1. import java.util.concurrent.ExecutorService;
  2. import java.util.concurrent.Executors;
  3. public class FixedThreadPool {
  4. public static void main(String[] args) {
  5. ExecutorService service = Executors.newFixedThreadPool(3);
  6. Task task1 = new Task("task 1");
  7. Task task2 = new Task("task 2");
  8. Task task3 = new Task("task 3");
  9. Task task4 = new Task("task 4");
  10. Task task5 = new Task("task 5");
  11. service.execute(task1);
  12. service.execute(task2);
  13. service.execute(task3);
  14. service.execute(task4);
  15. service.execute(task5);
  16. service.shutdown();
  17. }
  18. }
  19. class Task implements Runnable {
  20. private String name;
  21. public Task(String name) {
  22. this.name = name;
  23. }
  24. @Override
  25. public void run() {
  26. System.out.println(this.name + " 运行中... ");
  27. try {
  28. Thread.sleep(2000);
  29. } catch (InterruptedException e) {
  30. e.printStackTrace();
  31. }
  32. System.out.println(this.name + " 运行完毕 ");
  33. }
  34. }

运行结果如下:

  1. task 2 运行中...
  2. task 1 运行中...
  3. task 3 运行中...
  4. task 3 运行完毕
  5. task 1 运行完毕
  6. task 4 运行中...
  7. task 2 运行完毕
  8. task 5 运行中...
  9. task 4 运行完毕
  10. task 5 运行完毕

上面的运行结果我们可以看到,当task 1运行完毕后,task 4才开始运行的。

由于我们创建的线程池只有3个线程,而任务有5个,所以只能先处理3个任务,当线程有空闲的才能继续运行其它任务。

我们以图的形式来展示一下

扫码分享
版权说明
作者:SQBER
文章来源:http://sqber.com/articles/thread-pool-Executors.html
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。