печатать алфавиты и цифры по две нити по одному - PullRequest
0 голосов
/ 12 октября 2018

Я работаю над вопросом ниже интервью, где мне нужно распечатать алфавит и цифры, используя две темы.Один печатает алфавиты (a, b, c ... z) и другие печатает номера (1,2,3 .... 26).Теперь я должен реализовать это таким образом, чтобы вывод был:

a
1
b
2
...
...
z
26

Поэтому я пришел к следующему коду без синхронизации, но по какой-то причине он не печатает последний алфавит, который является z

class Output {
  private static final int MAX = 26;
  private static int count = 1;
  private static final Queue<Character> queue = new LinkedList<>(Arrays.asList(new Character[] {
      'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
      's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}));
  private boolean isAlphabet = true;

  public void printAlphabet() {
    while (true) {
      if (count > MAX)
        break;
      if (!isAlphabet) {
        System.err.println(Thread.currentThread().getName() + " : " + queue.remove());
        isAlphabet = true;
      }
    }
  }

  public void printNumber() {
    while (true) {
      if (count > MAX)
        break;
      if (isAlphabet) {
        System.err.println(Thread.currentThread().getName() + " : " + count++);
        isAlphabet = false;
      }
    }
  }
}


public class PrintAlphabetNumber {
  public static void main(String[] args) {
    Output p = new Output();
    Thread t1 = new Thread(() -> p.printAlphabet());
    t1.setName("Alphabet");
    Thread t2 = new Thread(() -> p.printNumber());
    t2.setName("Number");

    t1.start();
    t2.start();
  }
}

Есть ли проблема в моем коде выше?Также с точки зрения синхронизации это выглядит хорошо или нет?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

как они сказали, это не очень хороший код для этого, но проблема с этим кодом в том, что вы получили условие if в обратном направлении.

public void printAlphabet() {
    while (true) {
        if (count > MAX)
            break;
        if (isAlphabet) {// this was !isAlphabet
            System.err.println(Thread.currentThread().getName() + " : " + queue.remove());
            isAlphabet = false;//also here
        }
    }
}

public void printNumber() {
    while (true) {
        if (count > MAX)
            break;
        if (!isAlphabet) {// this was isAlphabet
            System.err.println(Thread.currentThread().getName() + " : " + count++);
            isAlphabet = true;//also here
        }
    }
}
0 голосов
/ 12 октября 2018

по какой-то причине не печатается последний алфавит, который является z

Вы прерываете, когда count > MAX, что верно после последнего номера.

Послепоследнее число, вы должны напечатать последнюю букву, но теперь count > MAX, поэтому она уже останавливается.

с точки зрения синхронизации, хорошо это выглядит или нет?

Нет, это выглядит не очень хорошо.

Вы используете спин-блокировку.Это очень неэффективно, так как оба цикла используют 100% ЦП постоянно, независимо от того, есть у них работа или нет.Также не гарантируется работа с энергонезависимыми переменными блокировки.

Классическое Java-решение будет использовать wait()/notify().

...