老大讓我把一個單線程的日播放量統計任務變成一個多線程的任務,時間由 2小時 優化到 30 分鐘以內,然後有了我與線程池死去活來的日子。
學習自:Java 併發編程 78 講
1 線程池的由來
在 Java 誕生之初是沒有線程池的概念的,而是先有線程,隨着線程數的不斷增加,人們發現需要一個專門的類來管理它們,於是才誕生了線程池。沒有線程池的時候,每發佈一個任務就需要創建一個新的線程,這樣在任務少時是沒有問題的
/**
* 描述:單個任務的時候,新建線程來執行
*/
public class OneTask {
public static void main(String[] args) {
Thread thread0 = new Thread(new Task());
thread0.start();
}
static class Task implements Runnable {
public void run() {
System.out.println("Thread Name: " + Thread.currentThread().getName());
}
}
}
執行結果:
Thread Name: Thread-0
如圖,主線程調用 start() 方法,啓動了一個 t0 的子線程。這是在一個任務的場景下,隨着我們的任務增多,比如現在有 10 個任務了,那麼我們就可以使用 for 循環新建 10 個子線程
/**
* 描述:for循環新建10個線程
*/
public class TenTask {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(new Task());
thread.start();
}
}
static class Task implements Runnable {
public void run() {
System.out.println("Thread Name: " + Thread.currentThread().getName());
}
}
}
執行結果: