1195.交互印刷文字列


目次

  • 1は、1つの信号量で、関係のない同時で、信号量を1つの流れのロックとして使用することができる.Atomicintegerはcasスピン
  • に似ていることが望ましい.

    1.1つの信号量で、関係のない同時で、信号量を1つの流れのロックとして使用することができる。Atomicintegerはcasスピンに似ていることが望ましい


    この数字を表す文字列を1からnまで出力できるプログラムを作成しますが、次のようにします.
    この数字が3で割り切れる場合は「fizz」を出力します.この数字が5で割り切れる場合は「buzz」を出力します.この数字が3と5で同時に割り切れる場合は「fizzbuzz」を出力します.例えば、n=15の場合、出力:1、2、fizz、4、buzz、fizz、7、8、fizz、buzz、11、fizz、13、14、fizzzbuzz.
    このようなクラスがあるとします.
    class FizzzBuzz{public FizzBuzz(int){…}////constructor public void fizz(printFizz){…}////only output“fizz”public void buzz(printBuzz){…}//////only output“buzz”public void fizzzbuzz(printFizzzzBuzz){…}//////only output“fizzzbuz”public void number(printNumber 4スレッドのマルチスレッド版FizzBuzzを実装してください.同じFizzzBuzzインスタンスは、次の4つのスレッドで使用されます.
    スレッドAはfizz()を呼び出して3で割り切れるか否かを判断し、できればfizzを出力する.スレッドBはbuzz()を呼び出して5で割り切れるか否かを判断し、できればbuzzを出力する.スレッドCはfizzbuzz()を呼び出して同時に3と5で割り切れるかどうかを判断し、できればfizzbuzzを出力する.スレッドDはnumber()を呼び出し、3でも5でも割り切れない数字を出力する.
    ソース:力ボタン(LeetCode)リンク:https://leetcode-cn.com/problems/fizz-buzz-multithreaded著作権はインターネットの所有に帰属する.商業転載は公式の授権に連絡してください.非商業転載は出典を明記してください.
    class FizzBuzz {
    	private int n;
    	private volatile int count = 1;// Atomicteger 
    	private Semaphore semaphore = new Semaphore(1);
    
    
    	public FizzBuzz(int n) {
    		this.n = n;
    	}
    
    	// printFizz.run() outputs "fizz".
    	public void fizz(Runnable printFizz) throws InterruptedException {
    		while (true) {
    			try {
    				semaphore.acquire();
    				if (count > n) {
    					return;
    				}
    				if (count % 3 == 0 && count % 5 != 0) {
    					printFizz.run();
    					count++;
    				}
    			} finally {
    				semaphore.release();
    			}
    		}
    	}
    
    	// printBuzz.run() outputs "buzz".
    	public void buzz(Runnable printBuzz) throws InterruptedException {
    		while (true) {
    			try {
    				semaphore.acquire();
    				if (count > n) {
    					return;
    				}
    				if (count % 5 == 0 && count % 3 != 0) {
    					printBuzz.run();
    					count++;
    				}
    			} finally {
    				semaphore.release();
    			}
    
    		}
    	}
    
    	// printFizzBuzz.run() outputs "fizzbuzz".
    	public void fizzbuzz(Runnable printFizzBuzz) throws InterruptedException {
    		while (true) {
    			try {
    				semaphore.acquire();
    				if (count > n) {
    					return;
    				}
    				if (count % 3 == 0 && count % 5 == 0) {
    					printFizzBuzz.run();
    					count++;
    				}
    			} finally {
    				semaphore.release();
    			}
    
    		}
    	}
    
    	// printNumber.accept(x) outputs "x", where x is an integer.
    	public void number(IntConsumer printNumber) throws InterruptedException {
            while (true) {
                try {
                    semaphore.acquire();
                    if (count > n) {
                        return;
                    }
                    if (count % 3 != 0&& count % 5 != 0) {
                        printNumber.accept(count);
                        count++;
                    }
                } finally {
                    semaphore.release();
                }
    
            }
    	}
    }