采用20个线程并发访问一个接口,要求只能访问10000次,不能出现线程安全问题 ,用java代码展示
时间: 2024-05-02 18:22:47 浏览: 8
可以使用Java中的线程池和Semaphore来实现这个功能。Semaphore用来控制并发访问的数量,线程池用来维护多个线程。
具体实现如下:
```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class Test {
private static final int THREAD_COUNT = 20;//线程数
private static final int ACCESS_COUNT = 10000;//总访问次数
private static final int ALLOWED_COUNT = 500;//允许的并发访问数
private static int curCount = 0;//当前并发访问数
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(ALLOWED_COUNT);//设置允许的并发访问数
ExecutorService executorService = Executors.newFixedThreadPool(THREAD_COUNT);//创建线程池
for (int i = 1; i <= ACCESS_COUNT; i++) {
executorService.execute(() -> {
try {
semaphore.acquire();//尝试获取信号量,若已满则等待
System.out.println(Thread.currentThread().getName() + " 访问接口中,当前并发访问数:" + (++curCount));
Thread.sleep(100);//接口访问,模拟一些时间
System.out.println(Thread.currentThread().getName() + " 访问接口结束,当前并发访问数:" + (--curCount));
semaphore.release();//释放信号量
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
executorService.shutdown();//关闭线程池
}
}
```
首先,我们定义了线程数和总访问次数,以及允许的并发访问数。
然后,使用Semaphore来控制并发访问。在访问接口前,使用acquire方法尝试获取一个信号量,若已满则等待;访问结束后,使用release方法释放信号量。这样就能保证同时并发访问的线程数不超过允许的数量。
最后,使用线程池创建20个线程,并让它们执行访问接口的任务。每次访问结束后,输出当前并发访问数,以便观察程序的运行情况。