這篇文章要跟大家介紹的內容是關於面試中可能會遇到的關於線程池的問題,有著一定的參考價值,有需要的朋友可以參考一下。
我們常會在面試中遇到多執行緒和執行緒池的問題,究竟要如何回答呢?今天關於Java中的執行緒池,我們就來學習一下。
執行緒池是指在初始化一個多執行緒應用程式過程中建立一個執行緒集合,然後在需要執行新的任務時重用這些執行緒而不是新一個執行緒。線程池中線程的數量通常完全取決於可用記憶體數量和應用程式的需求。然而,增加可用線程數量是可能的。執行緒池中的每個執行緒都有被指派一個任務,一旦任務已經完成了,執行緒回到池子中並等待下一次分配任務。
說白了就是為一應用執行多個執行緒的一個執行緒集合體。
使用線程池,我目前解決了一下問題:
#利用線程池, 取得一個影片中的多個封面,從而節省了一些時間和資源
後台伺服器不支援多張圖片上傳,利用執行緒池,進行多張圖片上傳,從而減少上傳的時間
效果圖如下:
# 上傳前:9張圖片至少要用3秒,利用執行緒池優化之後, 9張圖片要用1秒。
基於以下幾個原因在多執行緒應用程式中使用執行緒是必須的:
#1.減少了建立和銷毀執行緒的次數,每個工作執行緒都可以重複利用,可執行多個任務。
2.可以根據系統的承受能力,調整線程池中工作線線程的數目,防止因為消耗過多的內存,而把伺服器累趴(每個線程需要大約1MB內存,線程開的越多,消耗的內存也就越大,最後死機)。
執行緒池改進了一個應用程式的回應時間。由於執行緒池中的執行緒已經準備好且等待被指派任務,應用程式可以直接拿來使用而不用新建一個執行緒。
執行緒池節省了CLR 為每個短生存週期任務創建一個完整的執行緒的開銷並可以在任務完成後回收資源。
執行緒池根據目前在系統中運行的進程來最佳化執行緒時間片。
執行緒池允許我們開啟多個任務而不用為每個執行緒設定屬性。
執行緒池允許我們為正在執行的任務的程式參數傳遞一個包含狀態資訊的物件參考。
執行緒池可以用來解決處理一個特定請求最大執行緒數量限制問題。
安撫多歲的發發發
執行緒池作用就是在限制系統中執行線程的數量。
根據系統的環境狀況,可以自動或手動設定執行緒數量,達到運作的最佳效果;少了浪費了系統資源,多了造成系統擁擠效率不高。用線程池控制線程數量,其他線程排 隊等候。一個任務執行完畢,再從佇列的中取最前面的任務開始執行。若佇列中沒有等待進程,則執行緒池的此資源處於等待。當一個新任務需要運行時,如果線程池 中有等待的工作線程,就可以開始運行了;否則進入等待隊列。
舉例
new Thread(new Runnable() { @Override public void run() { paPaPaYourGridFriend(); } }).start();
如果你還在用new Thread執行一個非同步任務,so你就Out了!
如果你還在用new Thread執行一個非同步任務,so你就Out了!
如果你還在用new Thread執行一個非同步任務,so你就Out了!
a. 每次new Thread新物件效能差。
b. 線程缺乏統一管理,可能無限制新建線程,相互之間競爭,及可能佔用過多系統資源導致死機或oom。
c. 缺乏更多功能,如定時執行、定期執行、執行緒中斷。
1. newSingleThreadExecutor
建立一個單一執行緒的執行緒池。這個執行緒池只有一個執行緒在工作,也就是相當於單執行緒串列執行所有任務。如果這個唯一的執行緒因為異常結束,那麼會有一個新的執行緒來取代它。此執行緒池保證所有任務的執行順序都按照任務的提交順序執行。
2.newFixedThreadPool
#创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
3. newCachedThreadPool
创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,
那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
4.newScheduledThreadPool
创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
private void TextnewSingleThreadExecutor(){ ExecutorService pool = Executors. newSingleThreadExecutor(); MyTask1 task1 = new MyTask1(); MyTask2 task2 = new MyTask2(); MyTask3 task3 = new MyTask3(); // pool.execute(task1); // pool.execute(task2); // pool.execute(task3); new Thread(task1).start(); new Thread(task2).start(); new Thread(task3).start(); } private class MyTask1 implements Runnable{ @Override public void run() { //循环输出 for(int i = 0; i <h5>ScheduledExecutorService</h5><p><img src="https://segmentfault.com/img/remote/1460000015702768" alt=" " title=" "><br></p><h5>newFixedThreadPool</h5><p><img src="https://segmentfault.com/img/remote/1460000015702769" alt=" " title=" "></p><h5><img src="https://segmentfault.com/img/remote/1460000015702770" alt=" " title=" "></h5><p style="max-width:90%"><strong>newCachedThreadPool</strong></p><p><img src="https://segmentfault.com/img/remote/1460000015702771" alt=" " title=" "><br></p><h6>相比new Thread,Java提供的四种线程池的好处在于:</h6>
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。
线程池真的是太好用了,如果在项目中通过线程池管理线程,,你将会发现其中的诸多优势!
20+个很棒的Android开源项目
2018年Android面试题含答案--适合中高级(下)一份完整的Android Studio搭建Flutter教程[](http://mp.weixin.qq.com/s?__b...
深入了解JAVA的线程中断方法经验之总结
子线程为什么不能更新UI线程详解
相关推荐:
以上是php面試中可能會遇到的關於線程池的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!