JDK提供了一套Executor框架,可以幫助開發人員有效的使用線程池。
package com.wkcto.threadpool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 線程池的基本使用
*/
public class Test01 {
public static void main(String[] args) {
//創建有5個線程大小的線程池,
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
//向線程池中提交18個任務,這18個任務存儲到線程池的阻塞隊列中, 線程池中這5個線程就從阻塞隊列中取任務執行
for (int i = 0; i < 18; i++) {
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getId() + " 編號的任務在執行任務,開始時間: " + System.currentTimeMillis());
try {
Thread.sleep(3000); //模擬任務執行時長
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
}
package com.wkcto.threadpool;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 線程池的計劃任務
*/
public class Test02 {
public static void main(String[] args) {
//創建一個有調度功能的線程池
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
//在延遲2秒后執行任務, schedule( Runnable任務, 延遲時長, 時間單位)
scheduledExecutorService.schedule(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getId() + " -- " + System.currentTimeMillis() );
}
}, 2, TimeUnit.SECONDS);
//以固定的頻率執行任務,開啟任務的時間是固定的, 在3秒后執行任務,以后每隔5秒重新執行一次
/* scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getId() + "----在固定頻率開啟任務---" + System.currentTimeMillis());
try {
TimeUnit.SECONDS.sleep(3); //睡眠模擬任務執行時間 ,如果任務執行時長超過了時間間隔,則任務完成后立即開啟下個任務
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 3, 2, TimeUnit.SECONDS);*/
//在上次任務結束后,在固定延遲后再次執行該任務,不管執行任務耗時多長,總是在任務結束后的2秒再次開啟新的任務
scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getId() + "----在固定頻率開啟任務---" + System.currentTimeMillis());
try {
TimeUnit.SECONDS.sleep(3); //睡眠模擬任務執行時間 ,如果任務執行時長超過了時間間隔,則任務完成后立即開啟下個任務
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 3, 2, TimeUnit.SECONDS);
}
}