java指定線程數順序打印數字

問題

有kCount個線程,從1開始編號,順序打印1,2,3…,打印到n;
eg:kCount = 3; n = 10;
輸出:

Thread 1 -> 1
Thread 2 -> 2
Thread 3 -> 3
Thread 1 -> 4
Thread 2 -> 5
Thread 3 -> 6
Thread 1 -> 7
Thread 2 -> 8
Thread 3 -> 9
Thread 1 -> 10

即,每個線程只負責打印滿足 num % kCount == kNum 的num;
這樣就會有一個問題,當kNum 和 kCount相等的時候,num % kCount 的結果爲0,這個時候kNum號線程就會阻塞,且無法喚醒其它線程,形成死循環。
所以我們給線程編號的時候從0開始,而0號線程就相當於kNum號線程。

代碼
public class Main {

    public static void main(String[] args) {
        int k = 4;   // 要創建的線程數量
        int n  = 10;   // 最大打印到多少

        ShareSource shareSource = new ShareSource();
        for (int i = 0; i < k; i++) {
            new Thread(() -> {
                try {
                    shareSource.printNum(k, n);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },String.valueOf(i)).start();
        }
    }
}

class ShareSource {
    private int num = 1;

    public void printNum(int k, int target) throws InterruptedException {
        while(true) {
            synchronized (this) {
                int cK = Integer.parseInt(Thread.currentThread().getName());
                while (num % k != cK) {
                    if (num > target) {
                        break;
                    }
                    wait();
                }
                if (cK == 0) {
                    cK = k;
                }
                if (num > target) {
                    break;
                }
                System.out.println("Thread " + cK + "->" + num);
                num++;
                notifyAll();
            }
        }
    }
}
輸出
Thread 1->1
Thread 2->2
Thread 3->3
Thread 4->4
Thread 1->5
Thread 2->6
Thread 3->7
Thread 4->8
Thread 1->9
Thread 2->10
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章