На самом деле нить представляет собой абстрактное понятие. Это просто атомный процесс, который должен быть выполнен. Атомным я подразумеваю процесс, который, если вы его остановите (например, потому что он слишком длинный, и вы хотите выполнить другой), вам нужно сохранить его текущее состояние и восстановить его раньше, чтобы продолжить выполнение процесса. Теперь, что в этом процессе зависит от того, кем вы хотите. В C, например, языке, который был разработан для создания ОС, если я хорошо помню, процесс в основном представляет собой программу. Эта программа может попросить систему запускать другие программы или развернуть себя для запуска клона (с помощью функции fork()). Независимо от того, является ли это другой программой или клоном, это в любом случае другой процесс, который должен выполняться атомарно. В C поток - это программа. В Java поток представляет собой класс, расширяющий Thread. В C вы запускаете поток/программу, выполняя свою функцию main(), в Java вы запускаете поток/класс, выполняя свой метод run(). То есть для концепции потока. Это просто общее имя для программы или экземпляра Thread, который выполняется.
В настоящее время компьютерам необходимо выполнять много вещей параллельно. Это позволяет управлять несколькими потоками одновременно. Здесь идет пул потоков: это список потоков для выполнения. Больше ничего. Простой список. Но с этим у вас есть планировщик: у вас есть определенное количество «процессоров», и вам нужно решить, какие потоки будут выполняться на них, но вы не можете выполнять больше потоков, чем у вас есть «процессоры». Стратегия планировщика должна быть сконструирована так, чтобы экономить как можно больше времени, и это зависит от содержимого и зависимостей потоков. Могут использоваться различные стратегии, такие как сбалансированное время выполнения, круглая ротация, приоритеты и т. Д.
Я поставил «процессоры» в кавычки, потому что я имею в виду здесь «вычислительные устройства». Это может быть физический процессор компьютера или CPU, который в настоящее время имеет от 2 до 8 ядер (что означает, что он может запускать 2-8 потоков одновременно) и выполнять инструкции CPU (как правило, RISC). Это могут быть процессоры графической карты или GPU, которые имеют несколько десятков или сотен ядер, но используют другой набор инструкций. Iit также может быть процессором с виртуальной машины Java или JVM, который может запускать только один поток и использовать собственный набор инструкций (байт-код).Основное различие между JVM и двумя предыдущими заключается в том, что CPU и GPU взаимодействуют напрямую с оборудованием без посредников, в то время как JVM переводит свой собственный байт-код в инструкции RISC и запрашивает CPU для их выполнения.
CPU использует свой собственный планировщик для выполнения своих потоков (блок RISC-инструкций, а не только один). Позвольте называть его «системным потоком». Но когда вы программируете на Java, ваша среда исполнения не является системой, а JVM, которая предоставляет вам абстракцию системы (так вы можете запускать программу Java на любой машине, не заботясь о системе внизу). Это означает, что вам не разрешено напрямую связываться с системой, поэтому Java предоставляет вам способ обработки потоков на своем собственном уровне, позволяя создавать потоки (новый Thread()) и предоставлять их планировщику (SwingUtilities, Исполнители и т. Д.). Как ваши потоки Java транслируются в потоки системы и как ваш планировщик Java используется для замены системного планировщика, является задачей JVM.
Итак, когда вы говорите о потоке в Java, вы не говорите о потоке на системном уровне. Это JVM, который будет взаимодействовать с системой, чтобы вы имели подобное поведение. Но ваш поток Java не управляется процессором, поэтому вы можете запросить определенную стратегию планирования независимо от стратегии планирования процессора.
Как выполняется планирование потоков в Java ?. Доступно с: https://www.researchgate.net/post/How_is_Thread_scheduling_in_Java_done [доступно 22 мая 2017 года].
В интересах: http://stackoverflow.com/a/18311848/384464 – xagyg