多线程按顺序打印数字,支持配置线程数目和打印数字结尾

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();
                }
            }
        }
    }
}

posted @ 2020-05-10 18:33  zerodseu  阅读(229)  评论(0编辑  收藏  举报