Java(Android)線程池

?
1、new Thread的弊端
執行一個異步任務你還只是如下new Thread嗎?
[java]?view plaincopy
  1. new?Thread(new?Runnable()?{??
  2. ??
  3. ????@Override??
  4. ????public?void?run()?{??
  5. ????????//?TODO?Auto-generated?method?stub??
  6. ????}??
  7. }).start();??

那你就out太多了,new Thread的弊端如下:

a. 每次new Thread新建對象性能差。
b. 線程缺乏統一管理,可能無限制新建線程,相互之間競爭,及可能占用過多系統資源導致死機或oom。
c. 缺乏更多功能,如定時執行、定期執行、線程中斷。
相比new Thread,Java提供的四種線程池的好處在于:
a. 重用存在的線程,減少對象創建、消亡的開銷,性能佳。
b. 可有效控制最大并發線程數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞。
c. 提供定時執行、定期執行、單線程、并發數控制等功能。

?

2、Java 線程池
Java通過Executors提供四種線程池,分別為:
newCachedThreadPool創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。
newFixedThreadPool 創建一個定長線程池,可控制線程最大并發數,超出的線程會在隊列中等待。
newScheduledThreadPool 創建一個定長線程池,支持定時及周期性任務執行。
newSingleThreadExecutor 創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。

(1). newCachedThreadPool
創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。示例代碼如下:

[java]?view plaincopy
  1. ExecutorService?cachedThreadPool?=?Executors.newCachedThreadPool();??
  2. for?(int?i?=?0;?i?<?10;?i++)?{??
  3. ????final?int?index?=?i;??
  4. ????try?{??
  5. ????????Thread.sleep(index?*?1000);??
  6. ????}?catch?(InterruptedException?e)?{??
  7. ????????e.printStackTrace();??
  8. ????}??
  9. ??
  10. ????cachedThreadPool.execute(new?Runnable()?{??
  11. ??
  12. ????????@Override??
  13. ????????public?void?run()?{??
  14. ????????????System.out.println(index);??
  15. ????????}??
  16. ????});??
  17. }??

線程池為無限大,當執行第二個任務時第一個任務已經完成,會復用執行第一個任務的線程,而不用每次新建線程。

(2). newFixedThreadPool
創建一個定長線程池,可控制線程最大并發數,超出的線程會在隊列中等待。示例代碼如下:

[java]?view plaincopy
  1. ExecutorService?fixedThreadPool?=?Executors.newFixedThreadPool(3);??
  2. for?(int?i?=?0;?i?<?10;?i++)?{??
  3. ????final?int?index?=?i;??
  4. ????fixedThreadPool.execute(new?Runnable()?{??
  5. ??
  6. ????????@Override??
  7. ????????public?void?run()?{??
  8. ????????????try?{??
  9. ????????????????System.out.println(index);??
  10. ????????????????Thread.sleep(2000);??
  11. ????????????}?catch?(InterruptedException?e)?{??
  12. ????????????????//?TODO?Auto-generated?catch?block??
  13. ????????????????e.printStackTrace();??
  14. ????????????}??
  15. ????????}??
  16. ????});??
  17. }??

因為線程池大小為3,每個任務輸出index后sleep 2秒,所以每兩秒打印3個數字。

定長線程池的大小最好根據系統資源進行設置。如Runtime.getRuntime().availableProcessors()。可參考PreloadDataCache。

(3) newScheduledThreadPool
創建一個定長線程池,支持定時及周期性任務執行。延遲執行示例代碼如下:

[java]?view plaincopy
  1. ScheduledExecutorService?scheduledThreadPool?=?Executors.newScheduledThreadPool(5);??
  2. scheduledThreadPool.schedule(new?Runnable()?{??
  3. ??
  4. ????@Override??
  5. ????public?void?run()?{??
  6. ????????System.out.println("delay?3?seconds");??
  7. ????}??
  8. },?3,?TimeUnit.SECONDS);??

表示延遲3秒執行。

定期執行代碼如下:

[java]?view plaincopy
  1. scheduledThreadPool.scheduleAtFixedRate(new?Runnable()?{??
  2. ??
  3. ????@Override??
  4. ????public?void?run()?{??
  5. ????????System.out.println("delay?1?seconds,?and?excute?every?3?seconds");??
  6. ????}??
  7. },?1,?3,?TimeUnit.SECONDS);??

表示延遲1秒后每3秒執行一次。

ScheduledExecutorService比Timer更安全,功能更強大,后面會有一篇單獨進行對比。

(4)、newSingleThreadExecutor
創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。示例代碼如下:

[java]?view plaincopy
  1. ExecutorService?singleThreadExecutor?=?Executors.newSingleThreadExecutor();??
  2. for?(int?i?=?0;?i?<?10;?i++)?{??
  3. ????final?int?index?=?i;??
  4. ????singleThreadExecutor.execute(new?Runnable()?{??
  5. ??
  6. ????????@Override??
  7. ????????public?void?run()?{??
  8. ????????????try?{??
  9. ????????????????System.out.println(index);??
  10. ????????????????Thread.sleep(2000);??
  11. ????????????}?catch?(InterruptedException?e)?{??
  12. ????????????????//?TODO?Auto-generated?catch?block??
  13. ????????????????e.printStackTrace();??
  14. ????????????}??
  15. ????????}??
  16. ????});??
  17. }??

結果依次輸出,相當于順序執行各個任務。

單線程在某些情況下非常有用,現行大多數GUI程序都是單線程的。后面會介紹在Android中單線程在性能優化方面的用處。

轉載于:https://www.cnblogs.com/hudabing/p/4150265.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259636.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259636.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259636.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JQuery鏈式操作簡單的菜單列表

看到這個簡單的菜單demo&#xff0c;也是為了再看看JQuery對DOM的操作&#xff0c;一直都記不牢&#xff0c;特別是siblings&#xff08;&#xff09;這個總是想不起來。 這次再過一遍JQuery&#xff0c;不管簡單的還是復雜的demo 還是堅持練習一遍吧&#xff01;只為記錄&…

java 網絡編程實驗_Java網絡編程入門實驗一涉及點

1.http://www.cr173.com/html/20128_all.html 【wireshark怎么抓包、wireshark抓包詳細圖文教程】2.http://blog.csdn.net/huangjin0507/article/details/51678858 【HTTP協議1&#xff1a;工作原理】3.https://www.cnblogs.com/1666818961-lxj/p/7210021.html 【網絡常用端口號…

node.js async流程控制器--queue(隊列)

queue流程控制器是一個并行的流程控制器,但是它與parallel的區別在于queue可以控制一次執行幾個函數,而parallel只是讓所有函數并行執行. 例子如下: var q async.queue(function (obj,cb) {setTimeout(function () {console.log(obj);cb(); },obj.time) },1)for (var i 0; i&…

利用JS實現點擊上一周或下一周卻換

1.頁面加載顯示當前年份的第幾周 效果如圖&#xff1a; html代碼&#xff1a; <font size"2" color"black"> <input id"btnweek5" type"button" class"btn" value"上周" οnclick"EduCommissio…

centos7網卡編輯_CentOS7修改網卡為eth0

1.編輯網卡信息[rootlinux-node2~]#cd /etc/sysconfig/network-scripts/ #進入網卡目錄[rootlinux-node2network-scripts]# mv ifcfg-eno16777728 ifcfg-eth0 #重命名網卡名稱[rootlinux-node2 network-scripts]#cat ifcfg-eth0 #編輯網卡信息TYPEEthernetBOOTPROTOstaticDEFR…

C# 微支付退款申請接口 V3.3.6

/// <summary>/// 微支付退款申請/// </summary>/// <param name"context"></param>/// <param name"returnMsg"></param>/// <returns></returns>public bool Refund(HttpContext context, ref string r…

[轉] 英語、計算機、互聯網與全球化

http://davidzhao.blog.51cto.com/4548102/1225732 轉載于:https://www.cnblogs.com/wowk/p/3169638.html

APNIC IP 庫

http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest轉載于:https://www.cnblogs.com/dlwj/p/6388162.html

java reference 傳引用_Java的引用(reference)---Roni

摘自《Java面向對象編程》一書,作者:孫衛琴 來源:www.javathinker.org在JDK1.2以前的版本中&#xff0c;當一個對象不被任何變量引用&#xff0c;那么程序就無法再使用這個對象。也就是說&#xff0c;只有對象處于可觸及狀態&#xff0c;程序才能使用它。這就像在日常生活中&am…

C# 以管理員身份運行程序

剛看了一篇博友寫的“以管理員身份運行程序”, 所以我也來寫一個簡單易懂的&#xff0c;簡單兩步搞定&#xff0c;不用寫任何代碼&#xff1a; 第一步&#xff1a; 右鍵選擇項目 > 添加 > 新建項 &#xff1b; 找到 應用程序清單文件&#xff0c;后綴名為manifest&#x…

會計轉行從事IT,如何在一年時間內全職學習?

2019獨角獸企業重金招聘Python工程師標準>>> https://www.zhihu.com/question/21427478/answer/18227060 轉載于:https://my.oschina.net/soho00147/blog/836138

VS2010中使用CL快速 生成DLL的方法

方案一&#xff1a; 1、命令行中輸入cl example.cpp&#xff0c;生成example.obj和example.lib文件。有可能還會提示“沒有入口點”的錯誤。這是因為我們的CPP中是要生成dll文件的&#xff0c;并沒有main()這樣的主函數作為入口點。如果是C文件&#xff0c;則輸入cl /c exampl…

java field 獲得值_反射通用獲取字段值

像之前回答的那樣&#xff0c;您應該使用&#xff1a;Object value field.get(objectInstance);有時更喜歡的另一種方法是動態調用getter。示例代碼&#xff1a;public static Object runGetter(Field field, BaseValidationObject o){// MZ: Find the correct methodfor (Met…

android 中如何模擬back鍵

主要是在使用Fragment時能夠返回前一級&#xff0c;所以才找到了這些資料。 有兩種方式可以實現&#xff0c;直接上代碼 方法1&#xff1a; public void onBack(){new Thread(){public void run() {try{Instrumentation inst new Instrumentation();inst.sendKeyDownUpSync(Ke…

如何生成后綴表達式

如果計算一個表達式&#xff0c;比如 456*2&#xff0c;隨著計算器的不同&#xff0c;簡單的四功能計算器是30&#xff0c;許多科學計算器知道乘法的優先級高于加法&#xff0c;所以科學答案是21。典型計算順序可以是計算45&#xff0c;存為臨時變量a&#xff0c;再計算6*2&…

【原生JS插件】LoadingBar頁面頂部加載進度條

先展示一下已經實現的效果&#xff1a; 預覽地址&#xff1a;http://dtdxrk.github.io/js-plug/LoadingBar/index.html 看到手機上的瀏覽器內置了頁面的加載進度條&#xff0c;想用在pc上。 網上搜了一下&#xff0c;看到幾種頁面loading的方法&#xff1a; 1.在body頭部加入lo…

qtp啟動java程序_轉: QTP六脈神劍之調用Java程序

查看( 1147 ) /評論( 21 )六脈神劍之調用程序0Xp1zLN_0版權聲明&#xff1a;原創作品&#xff0c;轉載請以鏈接方式注明出自http://www.51testing.com/?35&#xff0c;否則將追究法律責任。51Testing軟件測試網y|X,taS51Testing軟件測試網b;|w6I"g6oK本文出自songfun的51…

Linq 數據庫操作(增刪改查)

Linq數據庫增刪改查 Linq是一種查詢語言&#xff0c;集成包含在formwork中&#xff0c;包含在C#語言中&#xff0c;它的作用是降低查詢的門檻&#xff0c;提高開發效率&#xff0c;是我們必須掌握的技術之一&#xff0c;下面是我自己對linq數據庫操作的方法&#xff0c;與大家…

第八章 Python 對象和類

一、什么是對象 在 Pyth 中&#xff0c;對象就是經過實例化的&#xff0c;具體可以操作的一組代碼的組合&#xff1b; 對象一般包含數據&#xff08;變量&#xff0c;更習慣稱之為屬性 attribute&#xff09;&#xff0c;也包含代碼&#xff08;函數&#xff0c;也稱之為方法&a…

JS同名方法,

JS同名方法只會調用最后一個方法。 JS中同時綁定多個事件&#xff0c;先綁定的先調用。后綁定的后調用。轉載于:https://www.cnblogs.com/daishuguang/p/4169718.html