繁体   English   中英

如何在java中将特定数量的线程限制为同步块

[英]How to restrict specific number of threads to synchronized block in java

我无法弄清楚这个问题。 在多线程环境中 - 正好 3 个线程应该能够执行同步块,其余的应该等待?

我的理解是,当我们使用同步或监视器时,一个线程将等待另一个线程在侧同步块或方法中完成其执行。 为了实现多线程进入同步块或方法,我们需要使用wait()、notify()、notifyAll(),即线程间通信,其中wait()方法在某个对象上调用时会获取它的锁并给机会其他等待线程。

所以,我想知道如何做上述问题。 我不确定我是否以正确的方式提出了我的问题。 如果可能的话,我们是否需要使用 java 并发 util 包,或者可以在基本(核心)线程功能中完成。

使用具有三个许可的信号量:

信号量通常用于限制可以访问某些(物理或逻辑)资源的线程数。

使用信号量可能是解决您的问题的最佳解决方案,但尝试自己的解决方案并没有什么坏处,即使这只是为了试验和学习新东西。

这是使用LinkedBlockingQueue的锁定实现的快速示例。 这个锁只允许一定数量的线程访问getKey()returnKey()之间的代码块:

public class Lock {

    private int keys;

    private LinkedBlockingQueue<Integer> q;

    public Lock(int keys) throws InterruptedException {
        q = new LinkedBlockingQueue<>();
        while (q.size() != keys)
            q.put(0);
    }

    public void getKey() throws InterruptedException {
        q.take();
    }

    public void returnKey() throws InterruptedException {
        q.put(0);
    }

    static Lock lck;
    public static void main (String [] args) throws InterruptedException {

        lck = new Lock(3);
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    lck.getKey();
                    Lock.test();
                    lck.returnKey();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };

        for (int t = 0; t < 10; t ++) 
            new Thread(r).start();
    }

    public static void test() throws InterruptedException {
        System.out.println("I am " + Thread.currentThread().getName());
        Thread.sleep(1000);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM