在Java中使用线程和信号量 - "获取()"工作?

时间:2015-03-23 14:52:52

标签: java multithreading semaphore

我目前正在参加“高级”(按照我们大学的CS课程标准)程序员的Java入门课程。虽然到目前为止我们所使用的概念都没有根本不同,但我对Semaphores的实用性感到困惑 - 我应该使用一个(或多个?)信号量来确保只有五个线程执行在任何给定时间的序列。因为我在哪里,我无法测试我的程序是否正朝着正确的方向前进,但我只需要弄清楚Semaphore.acquire()是如何工作的:

由于“acquire()”是信号量的方法,并且它不以线程(或任何东西)作为参数,你如何“选择”一个线程来获取许可证?它会自动将许可证应用于之前引用的线程吗?这基本上就是我现在要做的事情:

Thread selected = threads[int next_thread_to_add];
mySemaphore.acquire();

3 个答案:

答案 0 :(得分:1)

有一个简单的Semaphore样本。通过使用Semaphore,您可以传递Semaphore对象来确定可以运行多少个线程。

public class Test implements Runnable {
    Semaphore semaphore;
    public Test(Semaphore semaphore) {
        this.semaphore = semaphore;
    }

    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(1);
        Thread thread1 = new Thread(new Test(semaphore));
        Thread thread2 = new Thread(new Test(semaphore));
        Thread thread3 = new Thread(new Test(semaphore));
        Thread thread4 = new Thread(new Test(semaphore));
        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
    }

    @Override
    public void run() {
        try {
            semaphore.acquire();
            System.out.println("Hello World: " + Thread.currentThread().getName());
            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

答案 1 :(得分:0)

调用mySemaphoer.acquire()的当前运行的线程获取许可。你不选择线程,信号量,选择'线程只是通过acquire()调用前进。其他人等到他们被选中'

答案 2 :(得分:0)

  

因为" acquire()"是信号量的方法,并没有把一个线程(或任何东西)作为一个参数,你如何选择"获得许可的线索?

您需要先使用信号量.aquire()方法执行同步的代码块。在同步代码块的末尾,使用.release()方法,以便其他线程可以获取信号量。

  

它会自动将许可证应用于之前引用的线程吗?

不,无论运行什么线程,都会在信号量到达mySemaphore.acquire();行时尝试从信号量中获取()许可。

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html#acquire()

与使用信号量或锁定时的情况一样 - 小心避免使用deadlock