php面試中可能會遇到的關於線程池的問題

來源:互聯網
上載者:User
這篇文章給大家介紹的內容是關於面試中可能會遇到的關於線程池的問題,有著一定的參考價值,有需要的朋友可以參考一下。

前言

面試中我們經常會遇到多線程和線程池的問題,究竟如何回答呢?今天關於Java中的線程池,我們就來學習一下。

什麼是線程池

線程池是指在初始化一個多線程應用程式過程中建立一個線程集合,然後在需要執行新的任務時重用這些線程而不是建立一個線程。線程池中線程的數量通常完全取決於可用記憶體數量和應用程式的需求。然而,增加可用線程數量是可能的。線程池中的每個線程都有被分配一個任務,一旦任務已經完成了,線程回到池子中並等待下一次分配任務。

說白了就是為一應用執行多個線程的一個線程集合體

為什麼需要線程池?

使用線程池,我目前解決了一下問題:

  • 利用線程池, 擷取一個視頻中的多個封面,從而節約了一些時間和資源

  • 後台伺服器不支援多張圖片上傳,利用線程池,進行多張圖片上傳,從而減少上傳的時間

如下:



上傳前:9張圖片至少要用3秒,利用線程池最佳化之後, 9張圖片要用1秒。

基於以下幾個原因在多線程應用程式中使用線程是必須的:

  • 1.減少了建立和銷毀線程的次數,每個背景工作執行緒都可以被重複利用,可執行多個任務。

  • 2.可以根據系統的承受能力,調整線程池中工作線線程的數目,防止因為消耗過多的記憶體,而把伺服器累趴下(每個線程需要大約1MB記憶體,線程開的越多,消耗的記憶體也就越大,最後死機)。

    1. 線程池改進了一個應用程式的回應時間。由於線程池中的線程已經準備好且等待被分配任務,應用程式可以直接拿來使用而不用建立一個線程。

    2. 線程池節省了CLR 為每個短生存周期任務建立一個完整的線程的開銷並可以在任務完成後回收資源。

    3. 線程池根據當前在系統中啟動並執行進程來最佳化線程時間片。

    4. 線程池允許我們開啟多個任務而不用為每個線程設定屬性。

    5. 線程池允許我們為正在執行的任務的程式參數傳遞一個包含狀態資訊的對象引用。

    6. 線程池可以用來解決處理一個特定請求最大線程數量限制問題。

安撫多歲的發發發

線程池的作用:

線程池作用就是限制系統中執行線程的數量。
根據系統的環境情況,可以自動或手動設定線程數量,達到啟動並執行最佳效果;少了浪費了系統資源,多了造成系統擁擠效率不高。用線程池控制線程數量,其他線程排 隊等候。一個任務執行完畢,再從隊列的中取最前面的任務開始執行。若隊列中沒有等待進程,線程池的這一資源處於等待。當一個新任務需要運行時,如果線程池 中有等待的背景工作執行緒,就可以開始運行了;否則進入等待隊列。

單線程的弊端

舉個例子

new Thread(new Runnable() {@Overridepublic void run() {   paPaPaYourGridFriend();}}).start();
重要的事情說三遍!!!

如果你還在用new Thread執行一個非同步任務,so你就Out了!
如果你還在用new Thread執行一個非同步任務,so你就Out了!
如果你還在用new Thread執行一個非同步任務,so你就Out了!

弊端如下:
  • a. 每次new Thread建立對象效能差。

  • b. 線程缺乏統一管理,可能無限制建立線程,相互之間競爭,及可能佔用過多系統資源導致死機或oom。

  • c. 缺乏更多功能,如定時執行、定期執行、線程中斷。

Java 線程池

1. newSingleThreadExecutor

建立一個單線程的線程池。這個線程池只有一個線程在工作,也就是相當於單線程串列執行所有任務。如果這個唯一的線程因為異常結束,那麼會有一個新的線程來替代它。此線程池保證所有任務的執行順序按照任務的提交順序執行。

2.newFixedThreadPool

建立固定大小的線程池。每次提交一個任務就建立一個線程,直到線程達到線程池的最大大小。線程池的大小一旦達到最大值就會保持不變,如果某個線程因為執行異常而結束,那麼線程池會補充一個新線程。

3. newCachedThreadPool

建立一個可快取的線程池。如果線程池的大小超過了處理任務所需要的線程,

那麼就會回收部分空閑(60秒不執行任務)的線程,當任務數增加時,此線程池又可以智能的添加新線程來處理任務。此線程池不會對線程池大小做限制,線程池大小完全依賴於作業系統(或者說JVM)能夠建立的最大線程大小。

4.newScheduledThreadPool

建立一個大小無限的線程池。此線程池支援定時以及周期性執行任務的需求。

newSingleThreadExecutor
  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 < 100; i++)            {                System.out.print("A"+i+"\t");            }        }    }    private class MyTask2 implements Runnable{        @Override        public void run() {//            try {//                Thread.sleep(1000);//            } catch (InterruptedException e) {//                e.printStackTrace();//            }            //迴圈輸出            for(int i = 0; i < 100; i++)            {                System.out.print("B"+i+"\t");            }        }    }    private class MyTask3 implements Runnable{        @Override        public void run() {            //迴圈輸出            for(int i = 0; i < 100; i++)            {                System.out.print("C"+i+"\t");            }        }    }
ScheduledExecutorService


newFixedThreadPool

newCachedThreadPool


相比new Thread,Java提供的四種線程池的好處在於:
  • a. 重用存在的線程,減少對象建立、消亡的開銷,效能佳。

  • b. 可有效控制最大並發線程數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞。

  • c. 提供定時執行、定期執行、單線程、並發數控制等功能。

線程池真的是太好用了,如果在項目中通過線程池管理線程,,你將會發現其中的諸多優勢!

閱讀更多

20+個很棒的Android開源項目

2018年Android面試題含答案--適合中進階(下)一份完整的Android Studio搭建Flutter教程[](http://mp.weixin.qq.com/s?__b...

深入瞭解JAVA的線程中斷方法經驗之總結

子線程為什麼不能更新UI線程詳解

相信自己,沒有做不到的,只有想不到的

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.