【JavaEE】【多线程】线程池

打印 上一主题 下一主题

主题 670|帖子 670|积分 2010


一、线程池

线程池:线程池可以简单明白为存放多个线程的一段空间。
线程池的作用:就是把线程提前创建好,放入线程池中,必要线程时从线程池中取,线程用完归还到线程池中。如许就可以淘汰线程创建的开销。
   一个操作体系包罗内核和以及其它计算机体系所必须的组件,
而内核中包罗了操作体系的各种焦点功能:管理硬件设备,给软件提供稳定的运行情况。
而在计算机中以为有一段代码在应用步伐中完成,实行过程是可控的,而在内核中完成的过程是不可控的。而可控的操作比不可控更加高效。
  直接创建线程比从线程池拿线程开销小的缘故原由:


  • 直接创建线程,必要内核共同完成,是不可控的;
  • 先创建幸亏从线程池中去取,取线程就是可控的操作。
Java标准库中提供的类ThreadPoolExecutor就是创建线程池的类。
二、ThreadPoolExecutor类讲授

2.1 构造方法

在ThreadPoolExecutor类中主要提供了下面四种差别参数的构造方法。
我们讲授第四种7种参数版本中每个参数代表什么。

2.1.1 corePoolSize和maximumPoolSize

int corePoolSize代表焦点线程数的个数。焦点线程随着线程池的创建而创建,销毁而销毁。
int maximumPoolSize代表最大线程数。就是焦点线程数与非焦点线程数之和。非焦点线程是自适应创建的,不繁忙的时间就销毁,繁忙的时间在创建。
2.1.2 KeepAliveTime和unit

long KeepAliveTime代表非焦点线程答应空闲的最大时间。
TimeUnit unit代表时间单元。
TimeUnit是一个枚举类。

2.1.3 workeQueue

blockingQueue<Runnable> workQueue代表工作队列,也是一个阻塞队列。线程池本身就是一个生产者消耗者模型,调用submit方法就是在生产,线程池中的线程就是消耗者。
2.1.4 threadFactory

ThreadFactory threadFactory给线程Thread类提供的工厂类。
ThreadFactory是一个接口。

并不能直接出来一个对象,必要我们本身创建类实现该接口。
也可以使用Java中自带的默认的方式Executors类下的defaultThreadFactory方法:Executors.defaultThreadFactory();
工厂模式:工厂模式就是主要用来弥补构造方法的缺陷的一种计划模式。当构造方法因为重载限定时,可以当前类中使用static静态方法(这个静态方法也称为工厂方法)或者单独使用一个类提供静态方法(这个类称为工厂类),在静态方法中调用构造方法。
例子:我们表示一个点的坐标有使用(x,y)坐标系的方法和(ρ,θ)来表示。
像下面如许提供构造方法就会报错。

但是我们像下面如许提供一个工厂类就可以克制了。
  1. class Point {
  2.     double x;
  3.     double y;
  4.     double ρ;
  5.     double θ;
  6. }
  7. class PointFactory {
  8.     public static void PointXY(double x, double y) {
  9.         Point point = new Point();
  10.         point.x = x;
  11.         point.y = y;
  12.         
  13.     }
  14.     public static void Pointρθ(double ρ, double θ) {
  15.         Point point = new Point();
  16.         point.ρ = ρ;
  17.         point.θ = θ;
  18.     }
  19.    
  20. }
复制代码
2.1.5 handler

RejectedExectionHandler handler表示 拒绝策略。


在调用submit,将任务给到任务队列,而在线程池中不会像阻塞队列一样,队列满了就阻塞,而是提供了4中拒绝策略。



  • AbortPolicy:线程池中直接抛出非常,撂挑子不干了。
  • CallerRunsPolicy:让调用submit方法的线程本身实行这个任务。
  • DiscardOldestPolicy:丢弃线程池中最老的任务,给新任务腾出空间。
  • DiscardPolicy:丢弃线程池中最新的任务,即submit的任务。
三、简易构造线程池

在Java中提供了Exectors类对ThreadPoolExecutor类进行了进一步封装,可以使用这个类来创建一个默认的线程池。

四、本身实现一个简单线程池

我们创建一个固定容量的线程池,只实现其中的submit方法和构造方法。


  • 构造一个阻塞队列;
  • 在构造方法中传要创建的线程数,循环创建线程,在线程中循环拿出队列中的任务,并实行run方法,不要忘记start线程。
  • 在submit方法中只要将任务put到队列中即可。
  1. public class MyThreadPoolExecutor {
  2.     //
  3.     BlockingDeque<Runnable> queue = new LinkedBlockingDeque<>(1000);
  4.    
  5.     public MyThreadPoolExecutor(int n ) {
  6.         //创建n个线程
  7.         for (int i = 0; i < n; i++) {
  8.             Thread thread = new Thread(() -> {
  9.                 try{
  10.                     while(true) {
  11.                         Runnable task = queue.take();
  12.                         task.run();
  13.                     }
  14.                 } catch (InterruptedException e) {
  15.                     e.printStackTrace();
  16.                 }
  17.             });
  18.             thread.start();
  19.         }
  20.     }
  21.     public void submit(Runnable task) throws InterruptedException {
  22.         queue.put(task);
  23.     }
  24. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表