加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Java线程池实现道理与技能,看这一篇就够了

发布时间:2019-04-01 23:01:34 所属栏目:建站 来源:程序员柯南
导读:01.无穷制线程的弱点 多线程的软件计划要领确实可以最大限度地施展多核处理赏罚器的计较手段,提跨越产体系的吞吐量和机能。可是,若不加节制和打点的随意行使线程,对体系的机能反而会发生倒霉的影响。 一种最为简朴的线程建设和接纳的要领相同如下: newThre
副问题[/!--empirenews.page--]

Java线程池实现道理与技能,看这一篇就够了

01.无穷制线程的弱点

多线程的软件计划要领确实可以最大限度地施展多核处理赏罚器的计较手段,提跨越产体系的吞吐量和机能。可是,若不加节制和打点的随意行使线程,对体系的机能反而会发生倒霉的影响。

一种最为简朴的线程建设和接纳的要领相同如下:

  1. new Thread(new Runnable() { 
  2.             @Override 
  3.             public void run() { 
  4.                 //do sth 
  5.             } 
  6.         }).start(); 

以上代码建设了一条线程,并在run()要领竣事后,自动接纳该线程。在简朴的应用体系中,这段代码并没有太多题目。可是在真实的出产情形中,体系因为真真相形的必要,也许会开启许多线程来支撑其应用。而当线程数目过大时,反而会耗尽CPU和内存资源。

起首,固然与历程对比,线程是一种轻量级的器材,但其建设和封锁依然必要耗费时刻,假如为每一个小的使命都建设一个线程,很有也许呈现建设和烧毁线程所占用的时刻大于该线程真实事变所耗损的时刻,反而会得不偿失。

其次,线程自己也是要占用内存空间的,大量的线程会抢占名贵的内部资源。

因此,在现实出产情形中,线程的数目必需获得节制。盲目地大量建设线程对体系机能是有危险的。

02.简朴的线程池实现

下面给出一个最简朴的线程池,该线程池不是一个完美的线程池,但已经实现了一个根基线程池的焦点成果,有助于快速领略线程池的实现。

1.线程池的实现

  1. public class ThreadPool { 
  2.     private static ThreadPool instance = null; 
  3.  
  4.     //空闲的线程行列 
  5.     private List<PThread> idleThreads; 
  6.     //已有的线程总数 
  7.     private int threadCounter; 
  8.     private boolean isShutDown = false; 
  9.  
  10.     private ThreadPool() { 
  11.         this.idleThreads = new Vector<>(5); 
  12.         threadCounter = 0; 
  13.     } 
  14.  
  15.     public int getCreatedThreadCounter() { 
  16.         return threadCounter; 
  17.     } 
  18.  
  19.     //取得线程池的实例 
  20.     public synchronized static ThreadPool getInstance() { 
  21.         if (instance == null) { 
  22.             instance = new ThreadPool(); 
  23.         } 
  24.         return instance; 
  25.     } 
  26.  
  27.     //将线程池放入池中 
  28.     protected synchronized void repool(PThread repoolingThread) { 
  29.         if (!isShutDown) { 
  30.             idleThreads.add(repoolingThread); 
  31.         } else { 
  32.             repoolingThread.shutDown(); 
  33.         } 
  34.     } 
  35.  
  36.     //遏制池中全部线程 
  37.     public synchronized void shutDown() { 
  38.         isShutDown = true; 
  39.         for (int threadIndex = 0; threadIndex < idleThreads.size(); threadIndex++) { 
  40.             PThread pThread = idleThreads.get(threadIndex); 
  41.             pThread.shutDown(); 
  42.         } 
  43.     } 
  44.  
  45.     //执利用命 
  46.     public synchronized void start(Runnable target) { 
  47.         PThread thread = null; 
  48.         //假若有空闲线程,则直接行使 
  49.         if (idleThreads.size() > 0) { 
  50.             int lastIndex = idleThreads.size() - 1; 
  51.             thread = idleThreads.get(lastIndex); 
  52.             idleThreads.remove(thread); 
  53.             //当即执行这个使命 
  54.             thread.setTarget(target); 
  55.         }//没有空闲线程,则建设线程 
  56.         else { 
  57.             threadCounter++; 
  58.             //建设新线程 
  59.             thread = new PThread(target, "PThread #" + threadCounter, this); 
  60.             //启动这个线程 
  61.             thread.start(); 
  62.         } 
  63.     } 
  64.  

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读