Java线程:新特征-线程池

    Sun在Java 中 对Java线程的类库做了大量的扩展 其中线程池就是Java 的新特征之一 除了线程池之外 还有很多多线程相关的内容 为多线程的编程带来了极大便利 为了编写高效稳定可靠的多线程程序 线程部分的新增内容显得尤为重要       有关Java 线程新特征的内容全部在ncurrent下面 里面包含数目众多的接口和类 熟悉这部分API特征是一项艰难的学习过程 目前有关这方面的资料和书籍都少之又少 大所属介绍线程方面书籍还停留在java 之前的知识层面上       当然新特征对做多线程程序没有必须的关系 在java 之前通用可以写出很优秀的多线程程序 只是代价不一样而已       线程池的基本思想还是一种对象池的思想 开辟一块内存空间 里面存放了众多(未死亡)的线程 池中线程执行调度由池管理器来处理 当有线程任务时 从池中取一个 执行完成后线程对象归池 这样可以避免反复创建线程对象所带来的性能开销 节省了系统的资源       在Java 之前 要实现一个线程池是相当有难度的 现在Java 为我们做好了一切 我们只需要按照提供的API来使用 即可享受线程池带来的极大便利       Java 的线程池分好多种 固定尺寸的线程池 可变尺寸连接池       在使用线程池之前 必须知道如何去创建一个线程池 在Java 中 需要了解的是ncurrent Executors类的API 这个类提供大量创建连接池的静态方法 是必须掌握的   一 固定大小的线程池   import ncurrent Executors; import ncurrent ExecutorService; /** * Java线程 线程池 * * @author Administrator : : */ public class Test {         public static void main(String[] args) {                 //创建一个可重用固定线程数的线程池                 ExecutorService pool = Executors newFixedThreadPool( );                 //创建实现了Runnable接口对象 Thread对象当然也实现了Runnable接口                 Thread t = new MyThread();                 Thread t = new MyThread();                 Thread t = new MyThread();                 Thread t = new MyThread();                 Thread t = new MyThread();                 //将线程放入池中进行执行                 pool execute(t );                 pool execute(t );                 pool execute(t );                 pool execute(t );                 pool execute(t );                 //关闭线程池                 pool shutdown();         } } class MyThread extends Thread{         @Override         public void run() {                 System out println(Thread currentThread() getName()+ 正在执行 );         } }   pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 Process finished with exit code   二 单任务线程池       在上例的基础上改一行创建pool对象的代码为                 //创建一个使用单个 worker 线程的 Executor 以无界队列方式来运行该线程                 ExecutorService pool = Executors newSingleThreadExecutor();       输出结果为 pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 Process finished with exit code       对于以上两种连接池 大小都是固定的 当要加入的池的线程(或者任务)超过池最大尺寸时候 则入此线程池需要排队等待 一旦池中有线程完毕 则排队等待的某个线程会入池执行

    三 可变尺寸的线程池       与上面的类似 只是改动下pool的创建方式                 //创建一个可根据需要创建新线程的线程池 但是在以前构造的线程可用时将重用它们                 ExecutorService pool = Executors newCachedThreadPool();   pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 Process finished with exit code   四 延迟连接池   import ncurrent Executors; import ncurrent ScheduledExecutorService; import ncurrent TimeUnit; /** * Java线程 线程池 * * @author Administrator : : */ public class Test {         public static void main(String[] args) {                 //创建一个线程池 它可安排在给定延迟后运行命令或者定期地执行                 ScheduledExecutorService pool = Executors newScheduledThreadPool( );                 //创建实现了Runnable接口对象 Thread对象当然也实现了Runnable接口                 Thread t = new MyThread();                 Thread t = new MyThread();                 Thread t = new MyThread();                 Thread t = new MyThread();                 Thread t = new MyThread();                 //将线程放入池中进行执行                 pool execute(t );                 pool execute(t );                 pool execute(t );                 //使用延迟执行风格的方法                 pool schedule(t TimeUnit MILLISECONDS);                 pool schedule(t TimeUnit MILLISECONDS);                 //关闭线程池                 pool shutdown();         } } class MyThread extends Thread {         @Override         public void run() {                 System out println(Thread currentThread() getName() + 正在执行 );         } }   pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 Process finished with exit code

    五 单任务延迟连接池   在四代码基础上 做改动                 //创建一个单线程执行程序 它可安排在给定延迟后运行命令或者定期地执行                 ScheduledExecutorService pool = Executors newSingleThreadScheduledExecutor();   pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 Process finished with exit code   六 自定义线程池   import ncurrent ArrayBlockingQueue; import ncurrent BlockingQueue; import ncurrent ThreadPoolExecutor; import ncurrent TimeUnit; /** * Java线程 线程池 自定义线程池 * * @author Administrator : : */ public class Test {         public static void main(String[] args) {                 //创建等待队列                 BlockingQueue<Runnable> bqueue = new ArrayBlockingQueue<Runnable>( );                 //创建一个单线程执行程序 它可安排在给定延迟后运行命令或者定期地执行                 ThreadPoolExecutor pool = new ThreadPoolExecutor( TimeUnit MILLISECONDS bqueue);                 //创建实现了Runnable接口对象 Thread对象当然也实现了Runnable接口                 Thread t = new MyThread();                 Thread t = new MyThread();                 Thread t = new MyThread();                 Thread t = new MyThread();                 Thread t = new MyThread();                 Thread t = new MyThread();                 Thread t = new MyThread();                 //将线程放入池中进行执行                 pool execute(t );                 pool execute(t );                 pool execute(t );                 pool execute(t );                 pool execute(t );                 pool execute(t );                 pool execute(t );                 //关闭线程池                 pool shutdown();         } } class MyThread extends Thread {         @Override         public void run() {                 System out println(Thread currentThread() getName() + 正在执行 );                 try {                         Thread sleep( L);                 } catch (InterruptedException e) {                         e printStackTrace();                 }         } }

    pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 pool thread 正在执行 Process finished with exit code       创建自定义线程池的构造方法很多 本例中参数的含义如下

ThreadPoolExecutor

用给定的初始参数和默认的线程工厂及处理程序创建新的 ThreadPoolExecutor 使用 Executors 工厂方法之一比使用此通用构造方法方便得多 参数 corePoolSize 池中所保存的线程数 包括空闲线程 maximumPoolSize 池中允许的最大线程数 keepAliveTime 当线程数大于核心时 此为终止前多余的空闲线程等待新任务的最长时间 unit keepAliveTime 参数的时间单位 workQueue 执行前用于保持任务的队列 此队列仅保持由 execute 方法提交的 Runnable 任务 抛出 IllegalArgumentException 如果 corePoolSize 或 keepAliveTime 小于零 或者 maximumPoolSize 小于或等于零 或者 corePoolSize 大于 maximumPoolSize NullPointerException 如果 workQueue 为 null       自定义连接池稍微麻烦些 不过通过创建的ThreadPoolExecutor线程池对象 可以获取到当前线程池的尺寸 正在执行任务的线程数 工作队列等等       有关Java 线程池的内容到此就没有了 更多的内容还需要研读API来获取 lishixinzhi/Article/program/Java/hx/201311/26769



  • 瓒呰缁嗙殑绾跨▼姹浣跨敤瑙f瀽
    绛旓細(3)濡傛灉鏃犳硶灏嗕换鍔″姞鍏ュ埌闃诲闃熷垪(闃熷垪宸叉弧),鍒涘缓鏂扮殑绾跨▼鏉ュ鐞嗕换鍔(杩欓噷闇瑕佽幏鍙栧叏灞閿)銆(4)褰撳垱寤烘柊鐨勭嚎绋嬫暟閲忎娇绾跨▼姹犱腑褰撳墠杩愯绾跨▼鏁伴噺瓒呰繃 maximumPoolSize,绾跨▼姹犱腑鎷掔粷浠诲姟,璋冪敤 RejectedExecutionHandler.rejectedExecution() 鏂规硶澶勭悊銆傛簮鐮佸垎鏋:绾跨▼姹鍒涘缓绾跨▼鏃,浼氬皢绾跨▼灏佽鎴愬伐浣滅嚎绋 Worker,Worker 鍦...
  • java绾跨▼缁,绾跨▼姹,绾跨▼闃熷垪鍒嗗埆鏄粈涔?鏈変粈涔堝尯鍒?
    绛旓細褰撲竴涓柊浠诲姟鎻掑叆闃熷垪鏃讹紝涓涓┖闂茬嚎绋嬪氨浼氭垚鍔熺殑浠庨槦鍒椾腑鍙栧嚭浠诲姟骞朵笖鎵ц瀹冦绾跨▼姹缁忓父搴旂敤鍦ㄥ绾跨▼鏈嶅姟鍣ㄤ笂銆傛瘡涓氳繃缃戠粶鍒拌揪鏈嶅姟鍣ㄧ殑杩炴帴閮借鍖呰鎴愪竴涓换鍔″苟涓斾紶閫掔粰绾跨▼姹犮傜嚎绋嬫睜鐨勭嚎绋嬩細骞跺彂鐨勫鐞嗚繛鎺ヤ笂鐨勮姹傘備互鍚庝細鍐嶆繁鍏ユ湁鍏 Java 瀹炵幇澶氱嚎绋嬫湇鍔″櫒鐨勭粏鑺傘傜嚎绋嬮槦鍒楋細鏄寚绾跨▼澶勪簬鎷ュ鐨...
  • 绾跨▼姹鏈夊摢浜
    绛旓細绾跨▼姹鐨勭绫伙細涓銆佸浐瀹氬ぇ灏忕嚎绋嬫睜锛團ixed Thread Pool锛夊浐瀹氬ぇ灏忕嚎绋嬫睜鏄竴绉嶇嚎绋嬫暟閲忎笉鍙樼殑绾跨▼姹犮傚畠鍒涘缓鎸囧畾鏁伴噺鐨勭嚎绋嬶紝杩欎簺绾跨▼鍦ㄧ嚎绋嬫睜涓繚鎸佺瓑寰呯姸鎬侊紝澶勭悊鏂版彁浜ょ殑浠诲姟銆傝繖绉嶇嚎绋嬫睜閫傜敤浜庡彲浠ラ娴嬩换鍔″埌杈鹃熺巼鍜岀寮閫熺巼鐨勭幆澧冦Java涓鐨刞ThreadPoolExecutor`灏辨槸涓绉嶅浐瀹氬ぇ灏忕殑绾跨▼姹犲疄鐜般備簩銆佸彲...
  • 绠杩java绾跨▼姹鐨勭粍鎴愪笌浣滅敤
    绛旓細鍦ㄧ▼搴忓惎鍔ㄧ殑鏃跺欏氨鍒涘缓鑻ュ共绾跨▼鏉ュ搷搴斿鐞嗭紝瀹冧滑琚О涓绾跨▼姹锛岄噷闈㈢殑绾跨▼鍙伐浣滅嚎绋 绗竴锛氶檷浣庤祫婧愭秷鑰椼傞氳繃閲嶅鍒╃敤宸插垱寤虹殑绾跨▼闄嶄綆绾跨▼鍒涘缓鍜岄攢姣侀犳垚鐨勬秷鑰椼傜浜岋細鎻愰珮鍝嶅簲閫熷害銆傚綋浠诲姟鍒拌揪鏃讹紝浠诲姟鍙互涓嶉渶瑕佺瓑鍒扮嚎绋嬪垱寤哄氨鑳界珛鍗虫墽琛屻傜涓夛細鎻愰珮绾跨▼鐨勫彲绠$悊鎬с
  • Java瀹炵幇閫氱敤绾跨▼姹
    绛旓細绾跨▼姹閫氫織鐨勬弿杩板氨鏄鍏堝垱寤鸿嫢骞茬┖闂茬嚎绋 绛夊埌闇瑕佺敤澶氱嚎绋嬪幓澶勭悊浜嬪姟鐨勬椂鍊欏幓鍞ら啋鏌愪簺绌洪棽绾跨▼鎵ц澶勭悊浠诲姟 杩欐牱灏辩渷鍘讳簡棰戠箒鍒涘缓绾跨▼鐨勬椂闂 鍥犱负棰 绻佸垱寤虹嚎绋嬫槸瑕佽楄垂澶ч噺鐨凜PU璧勬簮鐨 濡傛灉涓涓簲鐢ㄧ▼搴忛渶瑕侀绻佸湴澶勭悊澶ч噺骞跺彂浜嬪姟 涓嶆柇鐨勫垱寤洪攢姣佺嚎绋嬪線寰浼氬ぇ澶у湴闄嶄綆绯荤粺鐨勬晥鐜 杩欐椂鍊欑嚎绋嬫睜灏辨淳 涓婄敤鍦轰簡 鏈枃...
  • java 绾跨▼姹璋冧紭鐨勬柟娉曟湁鍝簺?
    绛旓細Java绾跨▼姹璋冧紭鐨勬柟娉曟湁寰堝锛屼互涓嬫槸涓浜涘父瑙佺殑鏂规硶锛1. 璁剧疆鏈澶х嚎绋嬫暟鍜屾渶灏忕嚎绋嬫暟銆傚浜庣粰瀹氱‖浠朵笂鐨勭粰瀹氳礋杞斤紝鏈澶х嚎绋嬫暟璁剧疆涓哄灏戞渶濂藉憿锛熻繖涓棶棰樺洖绛旇捣鏉ュ苟涓嶇畝鍗曪細瀹冨彇鍐充簬璐熻浇鐗规т互鍙婂簳灞傜‖浠躲備竴鑸潵璇达紝鏈澶х嚎绋嬫暟搴旇璁剧疆涓哄彲鐢ㄥ鐞嗗櫒鏁伴噺鐨勪袱鍊嶃傛渶灏忕嚎绋嬫暟搴旇璁剧疆涓1銆2. 璁剧疆绾跨▼姹...
  • java 鎬庝箞瀹炵幇绾跨▼姹
    绛旓細鏈绠鍗曠殑鍙互鍒╃敤java.util.concurrent.Executors 璋冪敤Executors.newCachedThreadPool()鑾峰彇缂撳啿寮绾跨▼姹 Executors.newFixedThreadPool(int nThreads)鑾峰彇鍥哄畾澶у皬鐨勭嚎绋嬫睜
  • 绾跨▼姹鐨勫垱寤烘柟寮忔湁鍑犵
    绛旓細绾跨▼姹鏄竴绉嶅父瑙佺殑澶氱嚎绋嬪苟鍙戝鐞嗘妧鏈紝瀹冨彲浠ュ湪闇瑕佹墽琛屼换鍔$殑鏃跺欎负浠诲姟鎻愪緵涓涓嚎绋嬶紝浠庤岄伩鍏嶄簡姣忔鎵ц浠诲姟閮介渶瑕佸垱寤轰竴涓鏂扮殑绾跨▼鐨勫紑閿銆傜嚎绋嬫睜鐨勫垱寤烘柟寮忔湁鍑犵锛屽叾涓渶甯歌鐨勬槸浣跨敤ThreadPoolExecutor绫绘潵鍒涘缓绾跨▼姹犮俆hreadPoolExecutor绫绘槸Java涓鐨勪竴涓唴缃被锛屽畠鍙互鐢ㄤ簬鍒涘缓鍜岀鐞嗙嚎绋嬫睜銆傝繖涓被...
  • 绾跨▼姹浣跨敤鍙婁紭鍔
    绛旓細瀹冪殑涓昏鐗圭偣鍙互鎬荤粨涓猴細 绾跨▼澶嶇敤 锛 鎺у埗鏈澶у苟鍙戞暟 锛 绠$悊绾跨▼ 绾跨▼姹涓昏浼樺娍鍙堝涓嬩笁鐐锛欽ava涓鐨勭嚎绋嬫睜浣块氳繃 Executor 妗嗘灦瀹炵幇鐨勶紝浣跨敤绾跨▼姹犵敤鍒颁簡 Executor , Executors , ExecutorService , ThreadPoolExecutor 杩欏嚑涓被 鍏朵腑 Executors 鏄竴涓伐鍘傛柟娉曪紝鎻愪緵浜嗗揩鎹峰垱寤虹嚎绋嬫睜鐨勬柟娉曪紝甯哥敤鐨...
  • java甯哥敤鐨勫嚑绉绾跨▼姹瀹炰緥璁茶В
    绛旓細鏈鍚庣粰浣犺涓涓绾跨▼姹浠诲姟鎵ц娴佺▼锛氬綋绾跨▼姹犲皬浜巆orePoolSize鏃讹紝鏂版彁浜や换鍔″皢鍒涘缓涓涓鏂扮嚎绋鎵ц浠诲姟锛屽嵆浣挎鏃剁嚎绋嬫睜涓瓨鍦ㄧ┖闂茬嚎绋嬨傚綋绾跨▼姹犺揪鍒癱orePoolSize鏃讹紝鏂版彁浜や换鍔″皢琚斁鍏orkQueue涓紝绛夊緟绾跨▼姹犱腑浠诲姟璋冨害鎵ц 褰搘orkQueue宸叉弧锛屼笖maximumPoolSize>corePoolSize鏃讹紝鏂版彁浜や换鍔′細鍒涘缓鏂扮嚎绋嬫墽琛...
  • 扩展阅读:java线程池配置参数 ... java四种线程池 ... 为什么不建议用线程池 ... mysql ... springcloud五大组件 ... redis ... 线程池队列满了怎么办 ... jvm ... 四种线程池 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网