Два потока, запущенные в последовательных операторах, выполняются одновременно или они выполняются один за другим?

Посмотрите на следующий код. Все операторы в этом фрагменте выполняются в основном потоке. Потоки — это отдельные единицы выполнения, то есть два разных потока могут выполняться одновременно, независимо друг от друга, верно?

Означает ли это, что оператор new Thread(new Consumer()).start(); будет выполнен после завершения выполнения оператора new Thread(new Producer()).start(); (то есть, когда поток Producer завершит выполнение, то есть после того, как метод run() Producer возвратится)?

Или JVM просто получает и начинает выполнение инструкции new Thread(new Consumer()).start(); сразу после того, как она вызвала метод start() первого потока, т. е. пока первый поток Producer работает?

public class ThreadsCoordinationUsingGuardedBlocks {
    public static void main(String[] args) {
        new Thread(new Producer()).start();
        new Thread(new Consumer()).start();
    }
}

person Solace    schedule 13.02.2016    source источник
comment
Нет никаких гарантий относительно порядка выполнения того или иного. Вот почему Java и все разумные языки программирования действительно предоставляют механизмы для синхронизации выполнения. В Java одним из таких примеров может быть BlockingQueue.   -  person fge    schedule 13.02.2016


Ответы (2)


два разных потока могут выполняться одновременно, независимо друг от друга, верно?

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

после возврата метода run() Producer)?

Так что это возможно, также возможно, что потоки завершатся в обратном порядке.

Или JVM просто получает доступ и начинает выполнение нового потока (new Consumer()).start(); утверждение,

Примечание. JVM не реализует потоки. Это работа ОС. Все, что делает Java, — это делает системные вызовы ОС, чтобы сообщить ей об этом. JVM не знает, через какое время после вызова start() будут вызваны run() этих потоков.

person Peter Lawrey    schedule 13.02.2016

Вы должны предположить, что порядок недетерминирован. Thread(), вероятно, является запланированным событием, поэтому даже на однопроцессорном процессоре нет гарантии порядка выполнения, и вы также можете работать на многопроцессорном.

Ваш код должен явно обрабатывать синхронизацию — даже если какая-то особенность реализации, в которой вы работаете, приводит к детерминированному выполнению, явная синхронизация служит для сообщения о намерениях вашего кода и защищает от изменений в коде базового потока.

person dlu    schedule 13.02.2016