java 中 如何让一个方法内最多只能有两个线程访问
2个回答
展开全部
信号量Semaphore。下面代码里,一个semp的信号量初始值为5,.acquire()一次-1,.release()一次+1,如果信号量值为0的时候.acquire()就会阻塞线程,直到别的线程.release()。下面的实例是允许最多5个线程同时访问.acquire()和.release()之间的代码,你设置初始值为2就可以了。
public class SemaphoreTest {
public static void main(String[] args) {
// 线程池
ExecutorService exec = Executors.newCachedThreadPool();
// 只能5个线程同时访问
final Semaphore semp = new Semaphore(5);
// 模拟20个客户端访问
for (int index = 0; index < 20; index++) {
final int NO = index;
Runnable run = new Runnable() {
public void run() {
try {
// 获取许可
semp.acquire();
System.out.println("Accessing: " + NO);
Thread.sleep((long) (Math.random() * 10000));
// 访问完后,释放 ,如果屏蔽下面的语句,则在控制台只能打印5条记录,之后线程一直阻塞
semp.release();
} catch (InterruptedException e) {
}
}
};
exec.execute(run);
}
// 退出线程池
exec.shutdown();
}
}
给你个链接看看
展开全部
大体思想就是在方法中设置一个计数器,然后加一个同步锁synchronized,其中判断大于两个线程的时候线程休眠。具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Object sc = new Object();
//计数器
int count = 0;
public void fun(Thread t) {
synchronized (sc) {
//因为计数器开始是0,所以判断大于等于2就休眠
while (count >= 2) {
try {
sc.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count++;
}
// 业务
System.out.println(t.getName());
System.out.println(t.getId());
// 更新访问计数并唤醒等待的线程
count--;
sc.notifyAll();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Object sc = new Object();
//计数器
int count = 0;
public void fun(Thread t) {
synchronized (sc) {
//因为计数器开始是0,所以判断大于等于2就休眠
while (count >= 2) {
try {
sc.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count++;
}
// 业务
System.out.println(t.getName());
System.out.println(t.getId());
// 更新访问计数并唤醒等待的线程
count--;
sc.notifyAll();
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询