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();
}
}