Java線程池的基礎應用,java線程池
瞭解:原子性操作類的基礎用法
在java5以後,增加很多線程的內容,成為線程得並發庫。
在java.util.concurrent包及子包的API協助文檔,上面有對並發庫涉及內容
在java.util.concurrent.atomic包,有對基本資料,對數組中的基本資料,類中的基本資料等的操作
AtomicIneger類,可以解決多線程訪問整數的問題
AtomicBoolean.....
AtomicArray...運算元組的基本資料
AtomicIntegerFieldUodater<T>,操作類中的基本資料
並發庫的基本應用:
關於線程池的理解加深
以前只是知道有線程池這個東西,並不是很瞭解。
第一種方式:
Executors工具類,建立一個線程池,固定的線程池
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ThreadAtomic {public static void main(String[] args) {//5個線程的線程池ExecutorService threadPool = Executors.newFixedThreadPool(5);for(int j = 1;j<=10;j++){final int task = j;threadPool.execute(new Runnable(){public void run() {for(int i = 1;i<=10;i++){try {Thread.sleep(30);} catch (Exception e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+" is running "+i+" for task is "+ task);}}});//向池子中新增工作}System.out.println("10 task is over");}}
會發現,每次都只有5個任務在執行,執行到10次,後再換下5個任務
所以,池子中有n個線程,向池子中添加m個任務,能被執行的任務的最大數是n個,剩下的還未被執行的任務還在排隊等待。而且,不結束,因為池子中還有線程,雖然沒事幹,但還是在等待
threadPool.shutdownNow()/shutdown(),結束,就算還有任務也會被結束,該方法就是殺死池子中的所有線程。
第二種:
緩衝的線程池,簡單說就是線程池中的線程個數不確定,當有3個任務的時候,池子中的線程就是3個,每個線程拿一個任務做,當任務減少
時,池子中的多餘線程會被回收,總之,池子中的線程是動態
ExecutorService threadPool = Executors.newCachedThreadPool();
第三種:
只有一個線程的線程池,實際上不能叫做線程池,但是該線程池有一個好處,就是池中的線程死掉了,會自動建立一個新的線程,總之,
會保證池子中有一個線程存在,這也就可以解決,如何線上程死掉以後使其重新啟動
ExecutorService threadPool = Executors.newSingleThreadExecutor();
用線程池啟動定時器
調用ScheduledExectorService的schedule方法,返回的scheduleFuture對象可以取消任務
支援間隔重複任務的定時方式,不直接支援絕對定時方式,需要轉換成相對時間方式
Executors.newScheduledThreadPool(3).schedule(new Runnable() {public void run() {System.out.println("ok!");}}, 3, TimeUnit.SECONDS);//3秒後列印okExecutors.newScheduledThreadPool(3).scheduleAtFixedRate(new Runnable() {public void run() {System.out.println("ok!");}}, 3,2, TimeUnit.SECONDS);
//3秒後ok,以後每隔2秒ok
注意它沒有提供,比如今天晚上9點...的方法,所以可以用今天晚上9點的毫秒值-目前時間的毫秒值,來設定