java.util.concurrent.Semaphore
メソッドacquire()
とを使用するとrelease()
、許可は常に になると思います>=0
。for ループ内に 1 つのスレッドのみが存在できるように、スレッドを同期させたいとします。sem がSemaphore
初期値 1 の型の場合、これは 2 つ以上のスレッドでは機能しません。
while(true){
sem.wait(); // wait is acquire
for(int i=0; i<=5; i++){
try {
Thread.sleep(250);
}catch (InterruptedException e) {}
System.out.println("Thread "+ threadname+ " " + i);
}
sem.signal(); // signal is release }
ただし、Java から Semaphore クラスを実装し、これを可能にする独自のクラスを作成できます。
package yourpackage;
import java.util.concurrent.Semaphore;
public class SemaphoreLayer {
public Semaphore s=null;
public String name;
private int val;
public SemaphoreLayer(int i){
s=new Semaphore(i); val=i;
}
public void wait(){
try {
val--;
s.acquire();
} catch (InterruptedException e) {
System.out.println("Error signal semaphorelayer");
}}
public void signal(){
if(val<0){val++;}{
s.release();
val++;
}
}
}
val が負の値になることができるようになりました。ただし、これが完全に安全かどうかはわかりません。1 つのスレッドからシグナルがあり、もう 1 つのスレッドから待機している場合、それらが試みval++
て、val--
これが悪い可能性があるためです。(この可能性は非常に小さいですが、まだ存在するため、コーディングを行っており、100% エラーが発生しないようにする必要がある場合は、このコードを使用することはお勧めしません) Java とキーワードの同期。