Java線程池應用
1.減少了創建和銷毀線程的次數,每個工作線程都可以被重復利用,可執行多個任務。
2.可以根據系統的承受能力,調整線程池中工作線線程的數目,防止因為消耗過多的內存,而把服務器累趴下(每個線程需要大約1MB內存,線程開的越多,消耗的內存也就越大,最后死機)。
Java里面線程池的頂級接口是Executor,但是嚴格意義上講Executor并不是一個線程池,而只是一個執行線程的工具。真正的線程池接口是ExecutorService。
1. newSingleThreadExecutor
創建一個單線程的線程池。這個線程池只有一個線程在工作,也就是相當于單線程串行執行所有任務。如果這個唯一的線程因為異常結束,那么會有一個新的線程來替代它。此線程池保證所有任務的執行順序按照任務的提交順序執行。
2.newFixedThreadPool
創建固定大小的線程池。每次提交一個任務就創建一個線程,直到線程達到線程池的最大大小。線程池的大小一旦達到最大值就會保持不變,如果某個線程因為執行異常而結束,那么線程池會補充一個新線程。
3. newCachedThreadPool
創建一個可緩存的線程池。如果線程池的大小超過了處理任務所需要的線程,
那么就會回收部分空閑(60秒不執行任務)的線程,當任務數增加時,此線程池又可以智能的添加新線程來處理任務。此線程池不會對線程池大小做限制,線程池大小完全依賴于操作系統(或者說JVM)能夠創建的最大線程大小。
4.newScheduledThreadPool
創建一個大小無限的線程池。此線程池支持定時以及周期性執行任務的需求
下面我用2個實例來說明一下 ,線程池的簡單實用
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.TimeUnit;
- public class ThreadPool {
- public static void main(String[] args) {
- //ExecutorService ThreadPool = Executors.newFixedThreadPool(3);
- //ExecutorService ThreadPool = Executors.newCachedThreadPool();
- ExecutorService ThreadPool = Executors.newSingleThreadExecutor();
- for(int i=0;i<=4;i++){
- final int task = i;
- ThreadPool.execute(new Runnable() {
- @Override
- public void run() {
- for(int j=0;j<=10;j++){
- try {
- Thread.sleep(20);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(Thread.currentThread().getName() + " is loopping of " + j + " for task of " + task);
- }
- }
- });
- }
- //ThreadPool.shutdownNow();
- Executors.newScheduledThreadPool(3).scheduleAtFixedRate(new Runnable() {
- @Override
- public void run() {
- System.out.println("boombing!!");
- }
- }, 5, 2, TimeUnit.SECONDS);
- }
- }
- publicclass TestScheduledThreadPoolExecutor {
- publicstaticvoid main(String[] args) {
- ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
- exec.scheduleAtFixedRate(new Runnable() {//每隔一段時間就觸發異常
- @Override
- publicvoid run() {
- //throw new RuntimeException();
- System.out.println("================");
- }
- }, 1000, 5000, TimeUnit.MILLISECONDS);
- exec.scheduleAtFixedRate(new Runnable() {//每隔一段時間打印系統時間,證明兩者是互不影響的
- @Override
- publicvoid run() {
- System.out.println(System.nanoTime());
- }
- }, 1000, 2000, TimeUnit.MILLISECONDS);
- }
- }
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!