91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java線程池的使用實例

發布時間:2021-08-21 23:56:17 來源:億速云 閱讀:572 作者:chen 欄目:編程語言

這篇文章主要講解了“Java線程池的使用實例”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java線程池的使用實例”吧!

第一種:創建一個定長的線程池,控制線程最大并發數,超出的會在隊列中等待。

TestThreadPool.java

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

public class TestThreadPool {
    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();    //獲取開始時間
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);//設置線程池的最大線程數
        for (int i = 0; i < 10; i++) {
            final int index = i;//一般多線程并發都用final
            fixedThreadPool.execute(new Runnable() {
                public void run() {
                    System.out.println(index + "  " + Thread.currentThread().getName());
                }
            });
        }
        long endTime = System.currentTimeMillis();    //獲取結束時間
        System.out.println("程序運行時間:" + (endTime - startTime) + "ms");
    }
}

輸出結果:        Java線程池的使用實例 (當然輸出結果不是固定的,不過線程數一定不會超過5個)

可以看到 Thread.currentThread().getName() 拿到的name只有5種,說明最大線程數控制在 5 個

工作隊列用了LinkedBlockingQueue ,無界隊列,當任務多而線程數少時,任務會存在隊列里,容易內存溢出。

第二種:創建一個可緩存的線程池,可以靈活回收空閑線程,若無可回收,則新建線程。

TestThreadPool1.java

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestThreadPool1 {
    public static void main(String[] args) {
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 0; i < 10000; i++) {
            final int index = i;
            cachedThreadPool.execute(new Runnable() {
                public void run() {
                    System.out.println(index + "  " + Thread.currentThread().getName());
                }
            });
        }
    }
}

輸出結果的 Thread.currentThread().getName() 拿到的name有一兩千種(當然不同環境和配置的機器的結果最大線程數是不同的)

工作隊列使用SynchronousQueue同步隊列。會根據任務數創建線程,數量太大容易導致cpu使用率100%  99%

第三種:創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序執行。

TestThreadPool2.java

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestThreadPool2 {
    public static void main(String[] args) {
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10000; i++) {
            final int index = i;
            singleThreadExecutor.execute(new Runnable() {
                public void run() {
                    System.out.println(index + "  " + Thread.currentThread().getName());
                }
            });
        }
    }
}

輸出結果:無論循環100次還是100000次,輸出結果Thread.currentThread().getName()的值都會是

                   pool-1-thread-1

Java線程池的使用實例

第四種:創建一個定長線程池,可以延時或定時周期性地執行任務。

TestThreadPool3.java

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

public class TestThreadPool3 {
    public static void main(String[] args) {
        ExecutorService singleThreadExecutor = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            final int index = i;
            singleThreadExecutor.execute(new Runnable() {
                public void run() {
                    try {
                        while(true) {
                            System.out.println(index + "  " + Thread.currentThread().getName());
                            Thread.sleep(10 * 1000);
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
}

輸出結果:每隔10s就會輸出10行結果
                   Java線程池的使用實例

**使用 ScheduledExecutorService 的 scheduleAtFixedRate方法可以設置延時和執行間隔

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
Creates and executes a periodic action that becomes enabled first after the given initial delay,
and subsequently with the given period; that is executions will commence after initialDelay 
then initialDelay+period, then initialDelay + 2 * period, and so on.

意思是創建并執行一個在給定初始延遲后首次啟用的定期操作,后續操作具有給定的周期;也就是將在 initialDelay 后開始執行,然后在 initialDelay+period 后執行,接著在 initialDelay + 2 * period 后執行,依此類推。

TestThreadPool4.java

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class TestThreadPool4 {
    public static void main(String[] args) {
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
        System.out.println(System.currentTimeMillis());
        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
            public void run() {
                System.out.println(System.currentTimeMillis());
            }
        }, 5, 10, TimeUnit.SECONDS);
    }
}

從輸出結果可以看出,延時5s后每隔10s會輸出一次當前時間。

**使用ScheduledExecutorService的schedule可以設置首次執行延時

schedule(Runnable command, long delay, TimeUnit unit)
Creates and executes a one-shot action that becomes enabled after the given delay.

創建并執行在給定延遲后啟用的一次性操作。

TestThreadPool5.java

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class TestThreadPool5 {
    public static void main(String[] args) {
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
        for (int i = 0; i < 10; i++) {
            final int index = i;
            scheduledThreadPool.schedule(new Runnable() {
                public void run() {
                    System.out.println(index + "  " + Thread.currentThread().getName());
                }
            }, 3, TimeUnit.SECONDS);
        }
    }
}

輸出結果:運行3s后會輸出10行結果,而不會每隔3s輸出一行。

感謝各位的閱讀,以上就是“Java線程池的使用實例”的內容了,經過本文的學習后,相信大家對Java線程池的使用實例這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

农安县| 衡山县| 青州市| 姜堰市| 开化县| 宁武县| 阿鲁科尔沁旗| 襄汾县| 盐边县| 屏南县| 涟水县| 静乐县| 九龙坡区| 通城县| 海晏县| 长垣县| 乡城县| 湖州市| 章丘市| 弥勒县| 九龙城区| 丰台区| 特克斯县| 东城区| 峨边| 芷江| 广汉市| 大荔县| 常宁市| 十堰市| 瑞昌市| 天津市| 石阡县| 永丰县| 合阳县| 滁州市| 石渠县| 磐石市| 汉源县| 迁西县| 高邮市|