java 同步信号量 使用方法
其中核心是 同步信号量初始设置值为0,消费者取值的时候就挂起,只有生产者生产后,才会release同步信号量,
同步信号量才能进行操作。
import java.util.concurrent.Semaphore;
public class test {
int count = 0;
final Semaphore synSem = new Semaphore(0);
final Semaphore mutex = new Semaphore(1);
public static void main(String[] args) {
test t = new test();
new Thread(t.new Producer()).start();
new Thread(t.new Consumer()).start();
}
class Producer implements Runnable {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
try {
mutex.acquire();
count++;
System.out.println("生产者" + Thread.currentThread().getName()
+ "已生产完成,商品数量:" + count);
mutex.release();
} catch (Exception e) {
e.printStackTrace();
} finally {
synSem.release();
}
}
}
}
class Consumer implements Runnable {
@Override
public void run() {
while (true) {
try {
synSem.acquire();// 注意顺序
for (int i = 0; i < 5; i++) {
mutex.acquire();
count--;
System.out.println("消费者" + Thread.currentThread().getName()
+ "已消费,剩余商品数量:" + count);
mutex.release();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}
}
}