1195.交互印刷文字列
8131 ワード
目次
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();
}
}
}
}