Уточнение вывода «Три потока, использующие работающий интерфейс» - PullRequest
0 голосов
/ 15 апреля 2019

Я новичок в Java, сталкивался с многопоточностью.

0. Я немного запутался в использовании 'Несколько работающих интерфейсов в одном потоке' и 'Несколько потоков в одном выполняемом интерфейсе'.В чем разница, с точки зрения непрофессионала, пожалуйста?

1. Правильно ли я сказал, что следующий код 'Несколько потоков в одном выполняемом интерфейсе' ?

Вот что я сделал:

class NewThread implements Runnable{
    Thread t1, t2, t3;
    NewThread(){
        t1 = new Thread(this, "Demo Thread 1");
        t2 = new Thread(this, "Demo Thread 2");
        t3 = new Thread(this, "Demo Thread 3");
        t1.start(); //it automatically invokes run() method
        t2.start();
        t3.start();
    }

    public void run(){
        try{
            System.out.println("Child Thread 1: "+t1);
            t1.sleep(1000);
            System.out.println("Child Thread 2: "+t2);
            t2.sleep(1000);
            System.out.println("Child Thread 3: "+t3);
            t3.sleep(1000);
        }
        catch(InterruptedException e){
            System.out.println("Child Interrupted.");
        }
        System.out.println("Exiting child thread.");
    }
}
public class Main{
    public static void main(String[] args) {
        NewThread NT = new NewThread();
    }
}

Вот вывод :

Child Thread 1: Thread[Demo Thread 1,5,main]
Child Thread 1: Thread[Demo Thread 1,5,main]
Child Thread 1: Thread[Demo Thread 1,5,main]
Child Thread 2: Thread[Demo Thread 2,5,main]
Child Thread 2: Thread[Demo Thread 2,5,main]
Child Thread 2: Thread[Demo Thread 2,5,main]
Child Thread 3: Thread[Demo Thread 3,5,main]
Child Thread 3: Thread[Demo Thread 3,5,main]
Child Thread 3: Thread[Demo Thread 3,5,main]
Exiting child thread.
Exiting child thread.
Exiting child thread.

2. Почемувывод, как в цикле, я имею в виду: Child Thread 1 ... Child Thread 1 ... Child Thread 1 ... Child Thread 2 ... Child Thread 2 ... Child Thread 2 ...

Если я закомментирую t2, то вывод будет: Child Thread 1 ... Child Thread 1 ... Child Thread 3 ... Child Thread 3 ...?

Обновление 1

I Ожидаемый вывод как:

Child Thread 1 Thread[Demo Thread 1,5,main]
Child Thread 2 Thread[Demo Thread 2,5,main]
Child Thread 3 Thread[Demo Thread 3,5,main]
Exiting child thread.
Exiting child thread.
Exiting child thread.

3. Все ли эти потоки выполняются одновременно в JVM?

4. Что означает 5 & main в ... 5,main] в виде объекта нити?

Обновление 2

Я обновил try частькод:

System.out.println(Thread.currentThread().getName());
System.out.println("Child Thread 1: "+t1);
t1.sleep(1000);
System.out.println(Thread.currentThread().getName());
System.out.println("Child Thread 2: "+t2);
t2.sleep(1000);
System.out.println(Thread.currentThread().getName());
System.out.println("Child Thread 3: "+t3);
t3.sleep(1000);

Теперь вывод меня еще больше сбивает с толку:

Demo Thread 2
Demo Thread 3
Demo Thread 1
Child Thread 1: Thread[Demo Thread 1,5,main]
Child Thread 1: Thread[Demo Thread 1,5,main]
Child Thread 1: Thread[Demo Thread 1,5,main]
Demo Thread 1
Demo Thread 2
Demo Thread 3
Child Thread 2: Thread[Demo Thread 2,5,main]
Child Thread 2: Thread[Demo Thread 2,5,main]
Child Thread 2: Thread[Demo Thread 2,5,main]
Demo Thread 2
Demo Thread 1
Child Thread 3: Thread[Demo Thread 3,5,main]
Demo Thread 3
Child Thread 3: Thread[Demo Thread 3,5,main]
Child Thread 3: Thread[Demo Thread 3,5,main]
Exiting child thread.
Exiting child thread.
Exiting child thread.

5. Порядок тоже меняется (при разных прогонах)... Что именно происходит?

6. Так как я использую this для t1 t2 & t3 во время инициализации они в основном один и тот же поток?Если нет, что это значит?

7. Как я могу намеренно прервать любой из потоков, чтобы проверить возникшее исключение?


Прошу прощения за мою любознательность.

Спасибо

1 Ответ

0 голосов
/ 15 апреля 2019

Я думаю, что предложение 'thread in interface' также странно. Есть поток или нет, и он использует интерфейс Runnable, чтобы определить, что делается внутри него. Как только вы вызвали t.start (), у вас появился новый поток.

2: вывод выглядит как цикл, потому что все 3 потока выполняют первую печать, затем вторую печать, затем поток. Лучший способ увидеть вашу текущую тему - это печать Thread.currentThread().getName()

3: да

4: Thread.toString () печатает имя потока, приоритет и группу потоков. Таким образом, «main» - это имя исходного основного потока, а также этой группы потоков.

- Я думаю, что ваше неправильное представление проистекает из того факта, что у вас есть класс с именем NewThread, но на самом деле это Runnable, а не поток. Попробуйте вместо этого понять этот пример:

public class Main
{
  public static class NewRunnable implements Runnable
  {
    public void run()
    {
      try {
        String myName = Thread.currentThread().getName();
        for (int i = 0; i < 5; i++) {
          System.out.println("Child Thread: " + myName );
          Thread.sleep(1000);
        }
      }
      catch (InterruptedException e) {
        System.out.println("Child Interrupted.");
      }
      System.out.println("Exiting child thread.");
    }
  }

  public static void main(String[] args)
  {
    Thread t1 = new Thread(new NewRunnable(), "Demo Thread 1");
    Thread t2 = new Thread(new NewRunnable(), "Demo Thread 2");
    Thread t3 = new Thread(new NewRunnable(), "Demo Thread 3");
    t1.start(); // it automatically invokes run() method
    t2.start();
    t3.start();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...