Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用线程和信号量-如何;获取();工作_Java_Multithreading_Semaphore - Fatal编程技术网

在Java中使用线程和信号量-如何;获取();工作

在Java中使用线程和信号量-如何;获取();工作,java,multithreading,semaphore,Java,Multithreading,Semaphore,我目前正在为“高级”(按照我们大学CS程序的标准)程序员注册一门Java入门课程。虽然到目前为止,我们使用的概念没有一个完全不同,但我对信号量的实用性感到困惑——我应该使用一个(或多个?)信号量来确保在任何给定时间只有五个线程按顺序执行。由于我所处的位置,我现在无法测试我的程序是否朝着正确的方向前进,但我只需要弄清楚Semaphore.acquire()是如何工作的: 既然“acquire()”是信号量的方法,并且它不接受线程(或任何东西)作为参数,那么如何“选择”线程来获取许可?它是否会自动将

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

既然“acquire()”是信号量的方法,并且它不接受线程(或任何东西)作为参数,那么如何“选择”线程来获取许可?它是否会自动将许可证应用于前面提到的螺纹?这基本上就是我现在要做的:

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

当前运行的调用mySemaphoer.acquire()的线程获得许可。您不选择线程,信号量选择,而“selected”线程只是通过acquire()调用前进。其他的等待,直到他们成为“选择”

既然“acquire()”是信号量的方法,并且它不接受线程(或任何东西)作为参数,那么如何“选择”线程来获取许可

在执行要同步的代码块之前,您需要使用信号量
.aquire()
方法。在synchronized代码块的末尾,使用
.release()
方法,以便另一个线程可以获取信号量

它是否会自动将许可证应用于前面提到的螺纹

不,任何正在运行的线程都将在到达行
mySemaphore.acquire()时尝试从信号量获取()许可证


无论何时使用信号量或锁,都是如此-小心避免。

有一个简单的
信号量
示例。通过使用
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();
        }
    }
}

谢谢我想可能是这样的-我检查的资源中似乎没有一个表明调用是从线程中进行的。所有代码都是从线程中调用的,线程执行代码。在简单的“标准单线程”应用程序中,它是启动程序执行的主线程。如果您启动新线程,它们将从“自己的”代码开始(run方法的内容),几乎您只需显式指定
Thread
即可
t.start()
t.join()
。线程上的大多数其他操作都是线程隐式对自身执行的操作。例如,
semaphore.acquire()
为调用线程获取一个许可证。