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) {
// 具体执行推送
}
}