Java線程池的基礎應用

jopen 9年前發布 | 13K 次閱讀 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秒后打印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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!