(Multi-threaded) leetcode1195. La solución más simple imprimir alternativamente una variable de cadena para conseguir

Puede escribir una salida digital representativa del programa es de 1 a n cuerdas, pero:

Si este número puede ser divisible por 3, la salida de "efervescencia".
Si este número puede ser divisible por 5, la salida del "zumbido".
Si este número puede ser simultáneamente divisible por 3 y 5, la salida "FizzBuzz".
Por ejemplo, cuando n = 15, salida: 1, 2, fizz, 4 , zumbido, fizz, 7, 8, fizz, zumbido, 11, fizz, 13, 14, FizzBuzz.

Supongamos que hay una dicha clase:

FizzBuzz {clase
  FizzBuzz pública (n-int) {...} // constructor
  public void Fizz (printFizz) {...} // Salida sólo "Fizz"
  public void zumbido (printBuzz) {...} // única salida "zumbido"
  FizzBuzz public void (printFizzBuzz) {...} // sólo la salida "FizzBuzz"
  Número del public void (printNumber) {...} // sólo la salida a los a los números
}
Tenga en cuenta que tiene cuatro hilos de un multiproceso versión FizzBuzz, ejemplo FizzBuzz es el mismo que cuatro hilos:

Un subproceso llama Fizz () para determinar si es o no divisible por 3, si es así, fizz salida.
llamadas hilo B zumbido () puede ser divisible por 5 para determinar si, y si es así, el zumbido de salida.
El subproceso de llamada FizzBuzz C () para determinar si simultáneamente divisible por 3 y 5, si es así, FizzBuzz de salida.
El número de hilo D call () se utiliza para conseguir o bien no ser divisible por 3 5 números divisibles.

 

Significado de las preguntas: cuatro métodos eran cuatro tipos de impresión digital, pero la orden de ejecución Yao An.

Pensando: número digital representa la necesidad actual de impresión (ejecución), el otro hilo no determina por sí no son ejecutables. 1 a la ejecución digital actual.

import java.util.concurrent.Semaphore;

class FizzBuzz {
    private int n;
    private AtomicInteger number = new AtomicInteger(1);//当前应该打印的数字

    public FizzBuzz(int n) {
        this.n = n;
    }

    // printFizz.run() outputs "fizz".
    public void fizz(Runnable printFizz) throws InterruptedException {
        for (int i = 1; i <= n; i++) {
            if(i % 3 == 0 && i % 5 != 0){
                while(number.get()!=i)Thread.yield();
                printFizz.run();
                number.set(number.get()+1);
            }
        }
    }

    // printBuzz.run() outputs "buzz".
    public void buzz(Runnable printBuzz) throws InterruptedException {
        for (int i = 0; i <= n; i++) {
            if(i % 3 != 0 && i % 5 == 0){
                while(number.get()!=i)Thread.yield();
                printBuzz.run();
                number.set(number.get()+1);
            }
        }
    }

    // printFizzBuzz.run() outputs "fizzbuzz".
    public void fizzbuzz(Runnable printFizzBuzz) throws InterruptedException {
        for (int i = 1; i <= n; i++) {
            if(i % 3 == 0 && i % 5 == 0){
                while(number.get()!=i)Thread.yield();
                printFizzBuzz.run();
                number.set(number.get()+1);
            }
        }
    }

    // printNumber.accept(x) outputs "x", where x is an integer.
    public void number(IntConsumer printNumber) throws InterruptedException {
        for (int i = 1; i <= n; i++) {
            if (i % 3 != 0 && i % 5 != 0) {
                while(number.get()!=i)Thread.yield();
                printNumber.accept(i);
                number.set(number.get()+1);
            }
        }
    }
}

 

Publicados 616 artículos originales · ganado elogios 10000 + · vistas 1,53 millones +

Supongo que te gusta

Origin blog.csdn.net/hebtu666/article/details/104739987
Recomendado
Clasificación