java限流控制每秒併發數量

Semaphore版

package com.webservice.service;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Semaphore;

/**
 * @ClassName: TestSemaphore
 * @Description: 
 * @Author adm
 * @DateTime 2020年6月10日 上午9:53:13 
 */

public class TestSemaphore implements Runnable{
	
	public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static final Semaphore semaphore = new Semaphore(10, true); // 允許併發的任務量限制爲3個

    public static void main(String[] arg) {
        for (int i = 0; i < 10; i++) {
             Thread t = new Thread(new TestSemaphore());
             t.start();
        }
    }

    public void run() {
        try {
            semaphore.acquire(); // 獲取信號量,不足會阻塞
            System.out.println(sdf.format(new Date()) + " Task Start..");
            Thread.sleep(5000);
            System.out.println(sdf.format(new Date()) + " Task End..");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            semaphore.release(); // 釋放信號量
        }
    }

}

guava版(https://my.oschina.net/hanchao/blog/1833612?appinstall=0

package com.xx;

import com.google.common.util.concurrent.RateLimiter;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author hanliwei
 * @create 2018-06-21 17:10
 */
public class Test2 {

    public static void main(String[] args) {

        //新建一個每秒限制3個的令牌桶
        RateLimiter rateLimiter = RateLimiter.create(3.0);

        ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(100);
        for (int i = 0; i < 10; i++) {
            executor.execute(new Runnable() {
                @Override
                public void run() {
                    //獲取令牌桶中一個令牌,最多等待10秒
                    if (rateLimiter.tryAcquire(1, 10, TimeUnit.SECONDS)) {
                        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
                    }
                }
            });
        }

        executor.shutdown();
    }
}

 

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