問題
有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