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