1. 程式人生 > >一道經典的Java多執行緒程式設計題

一道經典的Java多執行緒程式設計題

問題描述

啟動3個執行緒列印遞增的數字, 執行緒1先列印1,2,3,4,5, 然後是執行緒2列印6,7,8,9,10, 然後是執行緒3列印11,12,13,14,15. 接著再由執行緒1列印16,17,18,19,20....以此類推, 直到列印到75. 程式的輸出結果應該為:

執行緒1: 1

執行緒1: 2

執行緒1: 3

執行緒1: 4

執行緒1: 5

執行緒2: 6

執行緒2: 7

執行緒2: 8

執行緒2: 9

執行緒2: 10

...

執行緒3: 71

執行緒3: 72

執行緒3: 73

執行緒3: 74

執行緒3: 75

解法:

public class Print {

    public static void main(String[] args) {
        new Thread(new PrintRunnable(1)).start();
        new Thread(new PrintRunnable(2)).start();
        new Thread(new PrintRunnable(3)).start();
    }
}
class PrintRunnable implements Runnable {

    private static volatile int printNum = 0;
    private int threadId;

    public PrintRunnable(int threadId){
        this.threadId = threadId;
    }
    @Override
    public void run() {

        synchronized (Print.class){
            while(printNum < 75){
                if (printNum/5%3 + 1 == threadId){
                    for (int i = 0; i <5; i++) {
                        System.out.println("執行緒"+threadId+":"+(++printNum));
                    }
                    Print.class.notifyAll();
                }else {
                    try {
                        Print.class.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    }
}