Я новичок в 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. Как я могу намеренно прервать любой из потоков, чтобы проверить возникшее исключение?
Прошу прощения за мою любознательность.
Спасибо