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

java \u4e2d \u5982\u4f55\u8ba9\u4e00\u4e2a\u65b9\u6cd5\u5185\u6700\u591a\u53ea\u80fd\u6709\u4e24\u4e2a\u7ebf\u7a0b\u8bbf\u95ee

\u5927\u4f53\u601d\u60f3\u5c31\u662f\u5728\u65b9\u6cd5\u4e2d\u8bbe\u7f6e\u4e00\u4e2a\u8ba1\u6570\u5668\uff0c\u7136\u540e\u52a0\u4e00\u4e2a\u540c\u6b65\u9501synchronized\uff0c\u5176\u4e2d\u5224\u65ad\u5927\u4e8e\u4e24\u4e2a\u7ebf\u7a0b\u7684\u65f6\u5019\u7ebf\u7a0b\u4f11\u7720\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a
Object sc = new Object(); //\u8ba1\u6570\u5668int count = 0; public void fun(Thread t) { synchronized (sc) { //\u56e0\u4e3a\u8ba1\u6570\u5668\u5f00\u59cb\u662f0\uff0c\u6240\u4ee5\u5224\u65ad\u5927\u4e8e\u7b49\u4e8e2\u5c31\u4f11\u7720 while (count >= 2) { try { sc.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } count++; } // \u4e1a\u52a1 System.out.println(t.getName()); System.out.println(t.getId()); // \u66f4\u65b0\u8bbf\u95ee\u8ba1\u6570\u5e76\u5524\u9192\u7b49\u5f85\u7684\u7ebf\u7a0b count--; sc.notifyAll(); }

1\uff09\u53ef\u4ee5\u5728\u8be5\u65b9\u6cd5\u4e0a\u52a0\u4e00\u4e2a\u540c\u6b65\u9501\uff0c\u8ba9\u5176\u53d8\u4e3a\u540c\u6b65\u65b9\u6cd5\uff0c\u8fd9\u6837\u6bcf\u6b21\u5c31\u53ea\u6709\u4e00\u4e2a\u7ebf\u7a0b\u53ef\u4ee5\u8bbf\u95ee\uff0c\u800c\u5176\u4ed6\u7684\u7ebf\u7a0b\u53ea\u6709\u7b49\u5230\u4ed6\u8bbf\u95ee\u5b8c\u4e4b\u540e\u624d\u6709\u673a\u4f1a\u8bbf\u95ee\u3002
2\uff09\u53ef\u4ee5\u5728\u65b9\u6cd5\u4e2d\u8bbe\u7f6e\u53c2\u6570count\uff0c\u8bbf\u95ee\u65f6\u7d2f\u52a0\uff0c\u7136\u540e\u5224\u65ad\u3002
\u4e00\u5b9a\u8981\u5173\u95ed\u7684\u8bdd\uff0c\u9996\u5148\u8981\u5224\u65ad\u662f\u90a3\u4e00\u4e2a\u7ebf\u7a0b\u8bbf\u95ee\u4e86\u65b9\u6cd5\uff0c\u4e4b\u540e\u5c06\u5176\u4ed6\u7684\u5173\u95ed\u5c31\u53ef\u4ee5\u4e86\u3002

信号量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



大体思想就是在方法中设置一个计数器,然后加一个同步锁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();
}

扩展阅读:java main方法怎么写 ... java 同步方法 ... java入门网站 ... java init方法 ... java的main简单方法 ... imac 按多次才能启动 ... java trim方法 ... java scanner三步骤 ... java中怎样编写一个方法 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网