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秒后打印ok Executors.newScheduledThreadPool(3).scheduleAtFixedRate(new Runnable() { public void run() { System.out.println("ok!"); } }, 3,2, TimeUnit.SECONDS);
//3秒后ok,以后每隔2秒ok
注意它沒有提供,比如今天晚上9點...的方法,所以可以用今天晚上9點的毫秒值-當前時間的毫秒值,來設置
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!