Таким образом, первая ключевая операция – это создание потоков.
Но ключевой момент здесь – вам нужно указать вычисление, которое должно быть выполнено в потоке.
Затем после создания потока, он фактически не начинает выполнение.
Поэтому, следующее, что вам нужно сделать, это вызвать метод start.
Теперь, ваша основная программа сама по себе является потоком.
И у нас есть основной поток, который создает и запускает другой поток.
В другом потоке выполняется свой код.
Теперь основной поток после запуска другого потока может выполнить свой код.
В этом случае у нас параллельно выполняются два куска кода на двух разных ядрах.
Класс Thread содержит метод join.
Метод join может быть использован для того, чтобы приостановить выполнение текущего потока до тех пор, пока другой поток не закончит свое выполнение.
Как правило, мы используем более одного потока.
В этом случае, планировщик потоков планирует потоки, что не гарантирует порядок выполнения потоков.
В идеальном мире все потоки всех программ работают на отдельных процессорах.
Но в реальности, потоки должны разделяться между одним или несколькими процессорами.
Либо JVM, либо операционная система базовой платформы определяют, как распределять ресурс процессора среди потоков – задача, известная как планирование потоков.
Эта часть JVM или операционной системы, которая выполняет планирование потоков, является планировщиком потоков.
Java не заставляет виртуальную машину планировать потоки определенным образом, поэтому планирование потоков зависит от конкретной платформы.
Предположим, у нас есть два потока t1 и t2.
Несмотря на то, что мы запустили потоки последовательно, планировщик потоков не запускает и не завершает их в указанном порядке.
Каждый раз, когда вы запускаете этот код, вы можете получить разные результаты.
А если поток t1 должен использовать вычисления потока t2, что нам делать?
Решить эту проблему мы можем с помощью метода join ().
Этот код запустит второй поток t2, только после завершения первого потока t1, так как метод join приостанавливает выполнение главного потока до тех пор, пока не завершится поток t1.
Если поток прерывается, бросается исключение InterruptedException.
Теперь, предположим, что мы передали в метод run класса MyClass основной поток и применили к нему метод join.
Тогда первый поток будет ждать, когда завершится основной поток, а основной поток будет ждать, когда завершится первый поток.