Как потоки выполняются в памяти? - PullRequest
2 голосов
/ 12 июля 2020

Я изучаю Thread в Java. Я пытался узнать, какой поток запущен. Но я не могу понять порядок вывода.

Ниже мой код

public class practice extends Thread {

public void run(){  
      for(int i=1;i<4;i++){  
         
        System.out.println(i); 
        System.out.println(Thread.currentThread().getName()); 
      }  
     
     }  

public static void main(String[] args) {
    
    practice t1=new practice();  
      practice t2=new practice();  
      practice t3=new practice();  
      
      t1.start();  
      t2.start(); 
      t3.start(); 
    }

}

Вывод:

1
1
1
Thread-1
2
Thread-1
3
Thread-1
Thread-0
2
Thread-0
3
Thread-0
Thread-2
2
Thread-2
3
Thread-2

Может ли кто-нибудь помочь мне в понять порядок вывода. Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 12 июля 2020

Потоки по своей природе параллельны друг другу . Это означает, что два (или более) потока соревнуются за один и тот же ресурс (ЦП), когда они выполняются одновременно, и ЦП переключается с выполнения одного на другой в случайном (непредсказуемом) порядке. Вы не можете и не будете знать, на какой путь выполнения (поток) ваш процессор и архитектура ОС решат перейти. Более того, на некоторых языках это может быть вопрос архитектуры ОС , на некоторых - только архитектуры ЦП , а на некоторых - обоих . Это зависит от того, как архитектура этого языка управляет потоками.

Обратите внимание, что даже если два потока параллельны - т.е. они выполняются параллельно на двух разных ядрах - вы все равно не можете предсказать, какое ядро сначала выполнит инструкцию.

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

1 голос
/ 12 июля 2020

Сначала ... отформатируйте код для лучшей видимости. Затем используйте java соглашение об именах. Чтобы найти их, посмотрите здесь . Кажется, что вы новичок в потоках и не понимаете их с первого взгляда. Неожиданный порядок связан с планированием ОС и концепцией выполнения инструкций , а не методов одновременно, это означает, что одновременное выполнение выполнение не означает, что метод run будет выполняться одновременно, это означает, что все (каждая инструкция) в этом методе может / будет выполняться одновременно. Просто продолжайте изучать темы - это (возможно) самая сложная область в Java, но также и самая интересная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...