JUC - Semaphore实现生产者消费者
public class Q {
int n;
static Semaphore semCon = new Semaphore(0);
static Semaphore semProd = new Semaphore(1);
public void put(int n){
try {
semProd.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
this.n = n;
System.out.println("put: "+ n);
semCon.release();
}
public void get(){
try {
semCon.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("get: "+ n);
semProd.release();
}
static class Producer implements Runnable{
int n;
Q q;
public Producer(int n, Q q) {
this.n = n;
this.q = q;
}
@Override
public void run() {
for (int i = 0; i < n; i++) {
q.put(i);
}
}
}
static class Consumer implements Runnable{
int n;
Q q;
public Consumer(int n, Q q) {
this.n = n;
this.q = q;
}
@Override
public void run() {
for (int i = 0; i < n; i++) {
q.get();
}
}
}
public static void main(String[] args) {
Q q = new Q();
new Thread(new Consumer(20,q),"Consumer").start();
new Thread(new Producer(20,q),"Producer").start();
}
}
运行结果:
put: 0
get: 0
put: 1
get: 1
put: 2
get: 2
put: 3
get: 3
put: 4
get: 4
put: 5
get: 5
put: 6
get: 6
put: 7
get: 7
put: 8
get: 8
put: 9
get: 9
put: 10
get: 10
put: 11
get: 11
put: 12
get: 12
put: 13
get: 13
put: 14
get: 14
put: 15
get: 15
put: 16
get: 16
put: 17
get: 17
put: 18
get: 18
put: 19
get: 19