Java解决抽烟者问题

import java.util.concurrent.Semaphore;
public class Demo5 {
static Semaphore offer1 = new Semaphore(0);
static Semaphore offer2 = new Semaphore(0);
static Semaphore offer3 = new Semaphore(0);
static Semaphore finish = new Semaphore(0);
static Semaphore desk = new Semaphore(1);
static int i = 0;
public static void main(String[] args) {
for (int j = 0; j < 3; j++) {
Thread provider = new Thread(new Prodiver());
provider.setName("provider" + i);
provider.start();
Thread smoke1 = new Thread(new Smoke1());
smoke1.setName("smoke1:" + i);
smoke1.start();
Thread smoke2 = new Thread(new Smoke2());
smoke2.setName("smoke2:" + i);
smoke2.start();
Thread smoke3 = new Thread(new Smoke3());
smoke3.setName("smoke3:" + i);
smoke3.start();
}
}
static class Prodiver implements Runnable {
@Override
public void run() {
while (true) {
try{
desk.acquire();
if (i == 0) {
offer1.release();
} else if (i == 1) {
offer2.release();
} else {
offer3.release();
}
i = (i + 1) % 3;
finish.acquire();
desk.release();
Thread.sleep(100);
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
static class Smoke1 implements Runnable {
static int num = 0;
@Override
public void run() {
while (true) {
try {
offer1.acquire();
num++;
System.out.println(Thread.currentThread().getName() + "Smoke1正在抽第" + num + "根烟");
finish.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class Smoke2 implements Runnable {
static int num = 0;
@Override
public void run() {
while (true) {
try {
offer2.acquire();
num++;
System.out.println(Thread.currentThread().getName() + "Smoke2正在抽第" + num + "根烟");
finish.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class Smoke3 implements Runnable {
static int num = 0;
@Override
public void run() {
while (true) {
try {
offer3.acquire();
num++;
System.out.println(Thread.currentThread().getName() + "Smoke3正在抽第" + num + "根烟");
finish.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}