// 输入m和n,创建n个线程交替打印m个数字
// 没什么说的就是把m个数字装入队列,n个线程每个去队列拿出来打印,打印完用Semaphore通知下一个线程
public class Test {
private static ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<>();
private static List<Semaphore> list = new ArrayList<>();
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
for (int i = 1; i <= m; i++) {
queue.offer(i);
}
for(int i=0;i<n;i++) {
if(i == 0) {
list.add(new Semaphore(1));
} else {
list.add(new Semaphore(0));
}
new Thread(new MyRunnable(i)).start();
}
}
static class MyRunnable implements Runnable {
private int threadIndex;
public MyRunnable(int i) {
threadIndex = i;
}
private Semaphore getNext() {
if(threadIndex == list.size() -1) {
return list.get(0);
} else {
return list.get(threadIndex + 1);
}
}
@Override
public void run() {
while (queue.size() != 0) {
try {
list.get(threadIndex).acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(queue.size() != 0) {
System.out.println(Thread.currentThread().getName() + " " + queue.poll());
}
this.getNext().release();
}
}
}
}