java異步多線程執行多資料執行個體。
本例是在資料庫中查出來不定量多的資料的時候,如果直接放入線程池,超出線程池緩存隊列數的話,會報拒絕異常,是以增加了一個計數器來避免超出線程池緩存隊列數。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.atomic.AtomicInteger;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
public class ThreadManager {
/**
* 線程池
*/
private final static ThreadPoolTaskExecutor EXECUTOR = new ThreadPoolTaskExecutor();
/**
* 計數器
*/
private final static AtomicInteger COUNTER = new AtomicInteger(0);
static {
EXECUTOR.setCorePoolSize(5); // 線程池維護線程的最少數量
EXECUTOR.setKeepAliveSeconds(200); // 允許的空閑時間
EXECUTOR.setMaxPoolSize(20); // 線程池維護線程的最大數量
EXECUTOR.setQueueCapacity(50); // 緩存隊列
EXECUTOR.initialize();
}
public void sendPost(final String url, final String param) {
synchronized (this) {
while (COUNTER.get() > 50) { // 如果記數器超過40,則等待一段時間
System.out.println("param:" + param + "等待");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
COUNTER.incrementAndGet(); // 任務開始前,計數器加1
}
EXECUTOR.execute(new Runnable() {
@Override
public void run() {
try {
doSendPost(url, param);
} finally {
// 任務完成後,計數器減1
int num = COUNTER.decrementAndGet();
}
}
});
}
// public static void main(String[] args) {
// ThreadManager manager = new ThreadManager();
// 測試執行100次處理
// for (int i = 0; i < 100; i++) {
// manager.sendPost("url", "num:" + i);
// }
// System.out.println("==============");
// }
private static String doSendPost(String url, String param) {
// 具體執行推送
}
}