Когда в методе main объявлено 2 объекта, код компилируется одновременно? - PullRequest
0 голосов
/ 21 октября 2019

Я занимаюсь многопоточностью. Но в настоящее время я испытываю сомнения относительно последовательности выполнения основного метода. Пожалуйста, объясните мне это, вопрос помечен ниже.

Это простая программа, которую я изучаю

public class HelloWorld implements Runnable  {
    private Thread t;
    private String threadname;

    HelloWorld(String name){
        threadname= name;
        System.out.println("Create " +threadname);
    }

    public void run() {
        System.out.println("Running " +threadname);
        try {
            for(int i=4; i>0;i--) {
                System.out.println("Thread" +threadname +", "+i);
                Thread.sleep(50);
            }
        }catch(InterruptedException e) {
            System.out.println("Thread" +threadname +"interrupted ");
        }
        System.out.println("Thread" +threadname +"exiting ");
    }

    public void start() {
        System.out.println("Starting " +threadname);
        if(t==null)
        {
            t=new Thread(this, threadname);
            t.start();
        }
    }

    public static void main(String[] args) {
        HelloWorld obj1= new HelloWorld ("Thread-1");
        obj1.start();

        HelloWorld obj2= new HelloWorld ("Thread-2");
        obj2.start();
    }
}

фактический результат

Create Thread-1
Starting Thread-1
Create Thread-2
Starting Thread-2
Running Thread-1
ThreadThread-1, 4
Running Thread-2
ThreadThread-2, 4
ThreadThread-2, 3
ThreadThread-1, 3
ThreadThread-1, 2
ThreadThread-2, 2
ThreadThread-1, 1
ThreadThread-2, 1
ThreadThread-2exiting 
ThreadThread-1exiting 

Мой вопрос:

Create Thread-1
Starting Thread-1
Create Thread-2(why here will switch from 1 to 2)
Starting Thread-2
Running Thread-1
ThreadThread-1, 4
Running Thread-2(At here, I understand the thread is switch when Thread.sleep(50) is being executed;)
ThreadThread-2, 4
ThreadThread-2, 3
ThreadThread-1, 3
ThreadThread-1, 2
ThreadThread-2, 2
ThreadThread-1, 1
ThreadThread-2, 1
ThreadThread-2exiting 
ThreadThread-1exiting 

Вопрос: почему здесь будет переключаться с 1 на 2? 2 объекта в основном методе запускаются одновременно?

1 Ответ

0 голосов
/ 21 октября 2019

Это потому, что вы используете многопоточность, а многопоточность обеспечивает параллельное выполнение.

В методе main вы запустили два дочерних потока obj1.start () и obj2.start (),До obj1.start () есть только один дочерний поток (основной поток является родительским). Но когда вы запускаете второй дочерний поток obj2.start (), теперь есть два дочерних потока, которые выполняются параллельно, поэтому переключение произошло. Оба потока будут иметь отдельный путь выполнения и будут работать параллельно.

Кроме того, переключение происходит из-за алгоритма планирования потоков (Round Robin и т. Д.), Используемого ЦП.

...