Executors建立的4種線程池的使用

Java經過Executors提供四種線程池,分別爲:java

  •     newCachedThreadPool建立一個可緩存線程池,若是線程池長度超過處理須要,可靈活回收空閒線程,若無可回收,則新建線程。
  •     newFixedThreadPool 建立一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待。
  •     newScheduledThreadPool 建立一個定長線程池,支持定時及週期性任務執行。
  •     newSingleThreadExecutor 建立一個單線程化的線程池,它只會用惟一的工做線程來執行任務,保證全部任務按照指定順序(FIFO, LIFO, 優先級)執行。

線程代碼:緩存

package org.morecare.thread;

public class ThreadForpools implements Runnable{

    private Integer index;
    public  ThreadForpools(Integer index)
    {
        this.index=index;
    }
    @Override
    public void run() {
        /***
         * 業務......省略
         */
        try {
            System.out.println("開始處理線程!!!");
            Thread.sleep(index*100);
            System.out.println("個人線程標識是:"+this.toString());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

(1) newCachedThreadPool


建立一個可緩存線程池,應用中存在的線程數能夠無限大服務器

package org.morecare.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class NewCachedThreadPool {

    /**
     * 咱們獲取四次次線程,觀察4個線程地址
     * @param args
     */
    public static  void main(String[]args)
    {
        ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
        System.out.println("****************************newCachedThreadPool*******************************");
        for(int i=0;i<4;i++)
        {
            final int index=i;
            newCachedThreadPool.execute(new ThreadForpools(index));

        }
    }
}

輸出結果是:能夠有無限大的線程數進來(線程地址不同),但須要注意機器的性能,須要線程太多,會致使服務器出現問題。併發

(2) newFixedThreadPool

建立一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待。示例代碼以下:ide

package org.morecare.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class NewFixedThreadPool {
    /**
     * 咱們獲取四次次線程,觀察4個線程地址
     * @param args
     */
    public static  void main(String[]args)
    {
        //線程池容許同時存在兩個線程
        ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2);
        System.out.println("****************************newFixedThreadPool*******************************");
        for(int i=0;i<4;i++)
        {
            final int index=i;
            newFixedThreadPool.execute(new ThreadForpools(index));
        }
    }
}

Executors.newFixedThreadPool(2);在線程池中保持二個線程能夠同時執行,可是注意,並非說線程池中永遠都是這二個線程,只是說能夠同時存在的線程數,當某個線程執行結束後,會有新的線程進來性能

輸出結果:每次只有兩個線程在處理,當第一個線程執行完畢後,新的線程進來開始處理(線程地址不同)this

(3)  newScheduledThreadPool

建立一個定長線程池,支持定時及週期性任務執行。延遲執行示例代碼以下:spa

package org.morecare.thread;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class NewScheduledThreadPool {
    /**
     * 咱們獲取四次次線程,觀察4個線程地址
     * @param args
     */
    public static  void main(String[]args)
    {
        ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(2);
        System.out.println("****************************newFixedThreadPool*******************************");
        for(int i=0;i<4;i++)
        {
            final int index=i;
            //延遲三秒執行
            newScheduledThreadPool.schedule(new ThreadForpools(index),3, TimeUnit.SECONDS);
        }
    }
}

執行結果:延遲三秒以後執行,除了延遲執行以外和newFixedThreadPool基本相同,能夠用來執行定時任務線程

newScheduledThreadPool共計有三個方法:3d

    schedule(commod,delay,unit) ,這個方法是說系統啓動後,須要等待多久執行,delay是等待時間。只執行一次,沒有周期性。

    scheduleAtFixedRate(commod,initialDelay,period,unit),這個是以period爲固定週期時間,按照必定頻率來重複執行任務,initialDelay是說系統啓動後,須要等待多久纔開始執行。例如:若是設置了period爲5秒,線程啓動以後執行了大於5秒,線程結束以後,當即啓動線程的下一次,若是線程啓動以後只執行了3秒就結束了那執行下一次,須要等待2秒再執行。這個是優先保證任務執行的頻率,

    scheduleWithFixedDelay(commod,initialDelay,delay,unit),這個是以delay爲固定延遲時間,按照必定的等待時間來執行任務,initialDelay意義與上面的相同。例如:設置了delay爲5秒,線程啓動以後無論執行了多久,結束以後都須要先生5秒,才能執行下一次。這個是優先保證任務執行的間隔

4) newSingleThreadExecutor

建立一個單線程化的線程池,它只會用惟一的工做線程來執行任務,保證全部任務按照指定順序(FIFO, LIFO, 優先級)執行。示例代碼以下:

package org.morecare.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class NewSingleThreadExecutor {
    /**
     * 咱們獲取四次次線程,觀察4個線程地址
     * @param args
     */
    public static  void main(String[]args)
    {
        ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
        System.out.println("****************************newFixedThreadPool*******************************");
        for(int i=0;i<4;i++)
        {
            final int index=i;
            newSingleThreadExecutor.execute(new ThreadForpools(index));

        }
    }
}

相關文章
相關標籤/搜索