Java四種執行緒池的使用
ava通過Executors提供四種執行緒池,分別為:
newCachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。
newFixedThreadPool 建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。
newScheduledThreadPool 建立一個定長執行緒池,支援定時及週期性任務執行。
newSingleThreadExecutor 建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行。
(1) newCachedThreadPool
建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。示例程式碼如下:
package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int index = i;
try {
Thread.sleep(index * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
cachedThreadPool.execute(new Runnable() {
public void run() {
System.out.println(index);
}
});
}
}
}
執行緒池為無限大,當執行第二個任務時第一個任務已經完成,會複用執行第一個任務的執行緒,而不用每次新建執行緒。
(2) newFixedThreadPool
建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。示例程式碼如下:
package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
final int index = i;
fixedThreadPool.execute(new Runnable() {
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
}
因為執行緒池大小為3,每個任務輸出index後sleep 2秒,所以每兩秒列印3個數字。
定長執行緒池的大小最好根據系統資源進行設定。如Runtime.getRuntime().availableProcessors()
(3) newScheduledThreadPool
建立一個定長執行緒池,支援定時及週期性任務執行。延遲執行示例程式碼如下:
package test;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
public void run() {
System.out.println("delay 3 seconds");
}
}, 3, TimeUnit.SECONDS);
}
}
表示延遲3秒執行。
定期執行示例程式碼如下:
package test;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
public void run() {
System.out.println("delay 1 seconds, and excute every 3 seconds");
}
}, 1, 3, TimeUnit.SECONDS);
}
}
表示延遲1秒後每3秒執行一次。
(4) newSingleThreadExecutor
建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行。示例程式碼如下:
package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
}
結果依次輸出,相當於順序執行各個任務。
你可以使用JDK自帶的監控工具來監控我們建立的執行緒數量,執行一個不終止的執行緒,建立指定量的執行緒,來觀察:
工具目錄:C:\Program Files\Java\jdk1.6.0_06\bin\jconsole.exe
執行程式做稍微修改:
package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ExecutorService singleThreadExecutor = Executors.newCachedThreadPool();
for (int i = 0; i < 100; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
public void run() {
try {
while(true) {
System.out.println(index);
Thread.sleep(10 * 1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
效果如下:
選擇我們執行的程式:
監控執行狀態
請您到ITEYE網站看 java小強 原創,謝謝!
http://cuisuqiang.iteye.com/ !
自建部落格地址:http://www.javacui.com/ ,內容與ITEYE同步!
相關文章
- java 四種執行緒池的使用Java執行緒
- java自帶的四種執行緒池Java執行緒
- Java 四種執行緒池的用法分析Java執行緒
- 執行緒池以及四種常見執行緒池執行緒
- Java 執行緒池四種拒絕策略Java執行緒
- Java程式猿必會的四種執行緒池Java執行緒
- Java通過Executors提供四種執行緒池Java執行緒
- JDK提供的四種執行緒池JDK執行緒
- 常見的四種執行緒池執行緒
- java中常見的四種執行緒池的區別Java執行緒
- Java併發程式設計:Java的四種執行緒池的使用,以及自定義執行緒工廠Java程式設計執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- JAVA執行緒池的使用Java執行緒
- java--執行緒池--建立執行緒池的幾種方式與執行緒池操作詳解Java執行緒
- Java提供的幾種執行緒池Java執行緒
- Java執行緒池二:執行緒池原理Java執行緒
- 詳解執行緒池的作用及Java中如何使用執行緒池執行緒Java
- 知道執行緒池的四種拒絕策略嗎?執行緒
- JAVA執行緒池的原理及使用Java執行緒
- Java執行緒池的使用和原理Java執行緒
- Java多執行緒——執行緒池Java執行緒
- Java執行緒池使用說明Java執行緒
- 執行緒池的五種狀態及建立執行緒池的幾種方式執行緒
- Java執行緒池Java執行緒
- java 執行緒池Java執行緒
- Android執行緒篇(四)深入理解Java執行緒池(二)Android執行緒Java
- 簡單的執行緒池(四)執行緒
- Java建立多執行緒的四種方式Java執行緒
- 執行緒池的使用執行緒
- java執行緒池趣味事:這不是執行緒池Java執行緒
- Java面試必問之執行緒池的建立使用、執行緒池的核心引數、執行緒池的底層工作原理Java面試執行緒
- java多執行緒9:執行緒池Java執行緒
- Java多執行緒18:執行緒池Java執行緒
- java中常見的六種執行緒池詳解Java執行緒
- Java 中執行緒池的7種建立方式!Java執行緒
- 執行緒安全使用 HashMap 的四種技巧執行緒HashMap
- 搞懂Java執行緒池Java執行緒
- Java Executors(執行緒池)Java執行緒