java 中 如何让一个方法内最多只能有两个线程访问

 我来答
翲燚
2017-08-02 · 知道合伙人软件行家
翲燚
知道合伙人软件行家
采纳数:436 获赞数:3030

向TA提问 私信TA
展开全部

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

给你个链接看看

http://blog.csdn.net/shihuacai/article/details/8856526

baby单纯就是傻
2017-08-02 · TA获得超过137个赞
知道小有建树答主
回答量:381
采纳率:16%
帮助的人:364万
展开全部
大体思想就是在方法中设置一个计数器,然后加一个同步锁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();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式