2017-01-20 4 views
4

Я читал Head First для многопоточности. Что я знаю о многопоточности является:Как диспетчер потоков JVM управляет потоками для мультипроцессоров?

Когда мы называем старт() с объектом Тема класса, поток переходит в состояние Runnable. Итак, все потоки идут до Runnable состояние после звонка start() объектом этого потока. Это JVM планировщик потоков, который выбирает нить случайным образом из Runnable состоянии дать его в Запуск состояние. После перехода на Запуск состояния будет выполнен определенный стек вызовов для этого конкретного потока.

Опять же, планировщик потоков JVM может прекратить выполнение потока, выбрав этот поток из состояния запуска в состояние Runnable. На этот раз выполнение кода приостанавливается в стеке вызовов этого потока.

Теперь мой вопрос, для многопроцессорной машины, как JVM нить планировщик выбирает нить из Runnable состояния? Выбирает ли только один поток и передает его процессору? Или он выбирает более одного потока и передает эти потоки в состояние запуска различных процессоров ?

Я написал ниже код:

// Class of main thread 
public class ThreadMain { 

    public static void main(String[] args) { 

     Runnable threadJob=new MyRunnable(); 
     Thread t=new Thread(threadJob); 
     t.start(); 
     System.out.println("Back in the Main"); 
    } 
} 
// Class of another thread 
public class MyRunnable implements Runnable{ 

    public void run() 
    { 
     System.out.println("I'm Thread"); 
    } 
} 

Здесь есть две темы. Основной поток и поток, который я создал. Если у моей машины многопроцессор, как она будет себя вести? Будет ли планировщик потоков JVM выбирать два потока за один раз и передать их двум мультипроцессорам?

+2

Существует не такая штука, как «планировщик потоков JVM». Планирование потоков выполняется операционной системой. – EJP

+0

Я не знаю, почему вы так пишете. Но во-первых, это ясно написано, JVM Thread Scheduler выполняет это планирование. @EJP – Mukit09

+0

И я ничего не пишу из этой «знаменитой» книги. @EJP – Mukit09

ответ

7

Термин «планировщик потоков JVM» имеет смысл, если рассматривать операционную систему, JVM и библиотеку классов как среду исполнения в целом. Тогда гарантируется, что в этой среде есть планировщик, независимо от того, как он реализован.

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

Например, для JVM Sun, который был в прошлом в прошлом тысячелетии. В это время появилась возможность использовать green threads, в отличие от собственных потоков. Обратите внимание, что эти потоки, реализованные без помощи операционной системы, не могут использовать несколько процессоров/ядер.

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

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

+0

очень хороший информация. Большое спасибо. :) – Mukit09

1

JVM использует базовую ОС (Unix, Windows и т. Д.) Механизм потоковой передачи, чтобы запланировать поток java на многопроцессорной системе.

+0

На самом деле, я хочу знать, что делает планировщик потоков JVM для мультипроцессора. – Mukit09

+1

@ Mukit09 На самом деле этот ответ говорит вам, что такой вещи нет. – EJP