import java.util.concurrent.atomic.AtomicInteger;
/**
* @author zerodsLyn
* created on 2020/5/10
*/
public class MultiThreadSerialPrint {
private final Thread[] threads;
/**
* 打印线程数目
*/
final int threadNum;
AtomicInteger num;
private final int end;
/**
* 打印任务是否结束
*/
volatile boolean running = true;
public ThreadPrint(int threadNum, int end) {
this.num = new AtomicInteger(0);
this.end = end;
this.threadNum = threadNum;
this.threads = new Thread[threadNum];
for (int i = 0; i < threadNum; i++) {
Thread thread = new Thread(new PrintTask(this), "thread-" + i);
threads[i] = thread;
}
}
public void run() {
for (Thread thread : threads) {
thread.start();
}
}
public static void main(String[] args) {
ThreadPrint threadPrint = new ThreadPrint(10, 100);
threadPrint.run();
while (threadPrint.running) ;
System.out.println("done");
}
private static class PrintTask implements Runnable {
private final ThreadPrint threadPrint;
public PrintTask(ThreadPrint threadPrint) {
this.threadPrint = threadPrint;
}
@Override
public void run() {
while (threadPrint.running) {
if (threadPrint.threads[threadPrint.num.get() % threadPrint.threadNum] == Thread.currentThread()) {
System.out.println(Thread.currentThread().getName() + " " + threadPrint.num.get());
if (threadPrint.num.get() == threadPrint.end) {
threadPrint.running = false;
}
threadPrint.num.incrementAndGet();
}
}
}
}
}