Почему Чар не печатает, а счетчик превысил мой цикл; - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь запустить эти три потока одновременно, но когда я делаю system.print Чар не выйдет, и счетчик «я» перешагнул.

как-то, я добавляю строку перед Char, она распечатывается правильно, кто-нибудь может объяснить мне, почему это происходит?

    public class Part2 {
    public static void main(String[] args) {            
        Runnable printA = new PrintChar('a');
        Runnable printB = new PrintChar('b');
        Runnable printC = new PrintChar('c');

        Thread t1 = new Thread(printA);
        Thread t2 = new Thread(printB);
        Thread t3 = new Thread(printC);

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

    private static class PrintChar implements Runnable { 
        private char c;
        public PrintChar(char c) {
            this.c = c;
        }

        public void run() 
        { 
            for(int i = 1; i<=100; i++) {
                System.out.print(c + i + ", ");
            }
        } 
    } 
    }

/ * это вывод этого кода: 98, 100, 101, 102, 103, 104, 105, 99, 99, .... 198, * /

/ * если я добавлю строку перед Char, как это Это результат, который я ожидал; * /

        public void run() 
        { 
            for(int i = 1; i<=100; i++) {
                System.out.print("" + c + i + ", ");
            }
        } 

/ * b1, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, .... a1 ~ a100 B1 ~ B100 и c1 ~ c100 работает и финиширует одновременно * /

Ответы [ 2 ]

3 голосов
/ 13 мая 2019

Когда вы используете оператор + для char и int, он выполняет арифметическое сложение, а не конкатенацию строк. Если сначала поставить "" +, значит, вы сначала выполняете "" + c, то есть объединение в String, затем добавляете это String к int, что является еще одним объединением.

0 голосов
/ 13 мая 2019

+ оператор имеет два значения в Java. Может представлять:

  • сложение , если оба операнда являются числовыми типами, а char считается числовым типом, поскольку внутренне его значением является число, представляющее положение символа в таблице Unicode, как для 'a' это будет 97 (как десятичное или 61 как шестнадцатеричное).

  • конкатенация , если хотя бы один операнд является строкой.

Также, поскольку оценка идет слева направо, c + i + ", " эквивалентно (c + i) + ", ". В (c + i) оба c и i являются числовыми типами, поэтому + представляет сложение и вычисляет 'a'+1, где 'a', как упомянуто ранее, рассматривается как 97, так что вы видите результат 97+1, что составляет 98.

После этого следующая операция - 98 + ", ", а здесь второй операнд - String, поэтому здесь + представляет конкатенацию. Таким образом, 98 + ", " приводит к строке "98, ".


В случае "" + c + i + ", " из-за порядка оценки слева направо мы можем выразить его как (("" + c) + i) + ", ".

  • Сначала ("" + c) будет "рассчитан", и поскольку первый операнд - String, + представляет конкатенацию, поэтому в результате получаем "" +'a', в результате получается String "a".
  • Далее "a" + i выполняется, и здесь также первый операнд имеет тип String, поэтому + также представляет конкатенацию, которая приводит к String "a1"
  • И наконец "a1" + ", " выполняется. Здесь оба операнда являются строками, поэтому + - это конкатенация, которая приводит к "a1, " строке.
...