java異步多線程執行多數據實例

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

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章