Сразу к делу
В ИТ-кругах всякий раз, когда мы говорим о параллелизме, мы обязательно имеем в виду серию потоков, одновременно выполняемых на компьютере. Если на этом компьютере установлено несколько процессоров или многоядерный процессор, то на самом деле он «работает одновременно», однако если компьютер имеет только одноядерный процессор, то «одновременная работа» — это всего лишь видимость;
Все современные операционные системы поддерживают одновременное выполнение задач. Вы можете слушать музыку и читать новости онлайн, не откладывая первое письмо. Мы можем сказать, что этот параллелизм является параллелизмом на уровне процессов. Внутри процесса я также вижу множество параллельных задач. Мы называем параллельные задачи, выполняемые в потоках процесса.
Другая распространенная концепция, связанная с параллелизмом, — это параллелизм. Между параллелизмом и параллелизмом существуют некоторые различия и некоторые связи. Некоторые программисты (Автор, транслитерируется как «программист») считают, что выполнение приложения с несколькими потоками на одноядерном процессоре является параллелизмом, и вы можете наблюдать за выполнением программиста, кроме того, когда ваша программа работает с несколькими потоками, Когда выполняются потоки; на нескольких процессорах или многоядерных процессорах они параллельны. Есть также некоторые программисты, которые думают, что если потоки приложения выполняются не в заданном порядке, то это параллелизм, чтобы упростить решение проблемы, используется поток, и эти потоки выполняются в определенном порядке; это параллелизм.
В этой главе будут использованы двенадцать примеров, чтобы продемонстрировать, как использовать API Java7 для выполнения некоторых основных операций с потоками. В программе Java вы сможете увидеть, как создавать и выполнять потоки, как контролировать выполнение потоков, как манипулировать группой потоков как единым целым и т. д.
В этом разделе мы узнаем, как создать поток в программе Java и как его запустить. В программе Java все является объектом, как и потоки. Существует два способа создания тредов:
1. Наследуйте класс Thread и переопределите метод run();
2. Создайте класс, реализующий интерфейс Runnable, затем создайте объект класса Thread, а затем передайте экземпляр класса, реализующего интерфейс Runnable, в качестве параметра экземпляру класса Thread.
В этом разделе мы воспользуемся вторым методом, чтобы создать десять потоков и запустить их. Каждый поток вычисляет и печатает произведение двух целых чисел в пределах десяти.
знай это
Чтобы реализовать этот пример, выполните шаги, описанные ниже:
1. Создайте класс с именем Calculator и реализуйте интерфейс Runnable. Код выглядит следующим образом:
Скопируйте код кода следующим образом:
Калькулятор публичного класса реализует Runnable {
2. Объявите частный целочисленный атрибут с именем Number и реализуйте конструктор этого класса для инициализации только что объявленного атрибута. Код выглядит следующим образом:
Скопируйте код кода следующим образом:
частный внутренний номер;
общедоступный калькулятор (число int) {
этот.номер = номер;
}
3. Реализовать метод run(), который представляет собой программу (инструкцию), которая запускается при выполнении созданного нами потока, поэтому этот метод используется для вычисления таблицы умножения. Конкретный код выглядит следующим образом:
Скопируйте код кода следующим образом:
@Override
общественный недействительный запуск () {
для (int я = 0; я <10; я++) {
System.out.printf("%s: %d * %d = %d/n",
Thread.currentThread().getName(),
число, я, я * число);
}
}
4. Теперь пришло время реализовать основной класс примера приложения. Создайте класс с именем Main и добавьте в него метод main. Код выглядит следующим образом:
Скопируйте код кода следующим образом:
общественный класс Main {
public static void main(String[] args) {
5. Внутри метода main() создайте цикл for, который проходит десять раз. В теле цикла создайте объект-калькулятор класса Calculator, создайте объектный поток класса Thread и передайте калькулятор в качестве параметра метода. конструктор для оператора инициализации. Наконец, вызовите метод start() объекта потока. Код выглядит следующим образом:
Скопируйте код кода следующим образом:
для (int я = 0; я <10; я++) {
Калькулятор калькулятор = новый калькулятор (i);
Поток потока = новый поток (калькулятор);
поток.start();
}
6. Запустите эту программу, чтобы увидеть, как одновременно выполняются разные потоки.
знаю почему
Ниже приведен фрагмент вывода, выводимого на консоль при запуске программы. Мы видим, что все созданные нами потоки выполняются одновременно.
Скопируйте код кода следующим образом:
Нить-3: 3*5 = 15
Поток-0: 0 * 2 = 0
Нить-3: 3*6 = 18
Поток-1: 1 * 6 = 6
Поток-1: 1 * 7 = 7
Нить-3: 3 * 7 = 21
Нить-3: 3 * 8 = 24
Поток-0: 0 * 3 = 0
Поток-0: 0 * 4 = 0
Нить-3: 3 * 9 = 27
Поток-1: 1 * 8 = 8
Все программы Java выполняют хотя бы один поток. Когда мы запускаем программу Java, виртуальная машина Java (далее называемая JVM) запускает поток и вызывает программу, содержащую метод main().
Когда вызывается метод start() объекта Thread, создается другой поток. Сколько раз вызывается метод start(), сколько потоков будет создано.
Когда все потоки завершат выполнение, программа Java завершится. (За исключением особых обстоятельств, выполняются все потоки, не являющиеся демонами.) Когда стартовый поток (например, поток, выполняющий метод main()) завершается, остальные потоки будут продолжать выполняться до тех пор, пока вычислительная задача не будет завершена. Когда один из потоков вызывает System.exit(), запрашивая JVM завершить программу, все потоки прекращают свое выполнение.
При вызове метода run() объекта Thread поток не будет создан, аналогично, когда вызывается метод run() класса, реализующего интерфейс Runnable, поток не будет создан; Поток создается только при вызове метода start() объекта Thread.
бесконечный
Как упоминалось в начале этого раздела, существует другой способ создания потока: наследовать класс Thread и переопределить метод run(). Таким образом, вы можете создать объект подкласса Thread, а затем вызвать start(). Метод объекта. Создать поток.
Скопируйте код кода следующим образом:
Поскольку я готовился к собеседованию, я нашел кучу информации о многопоточности Java, в том числе эту «Кулинарную книгу по параллелизму Java 7». Объяснения очень просты и понятны. Она очень подойдет для незнакомых друзей. много о многопоточности, но хочу серьезно изучить ее. После поиска я не смог найти китайскую версию, поэтому решил сам приготовить достаточно еды и одежды. Поэтому мы планируем опубликовать неофициальный перевод, название которого предварительно будет называться «Коллекция примеров параллелизма Java7».
Используйте доктрину
Эта статья переведена из «Книги по параллелизму Java 7» (Д Гуа Ге украл ее как «Коллекция примеров параллелизма Java7») и используется только в качестве учебных материалов. Его нельзя использовать в коммерческих целях без разрешения.
Небольшой успех
В оригинальной книге нет полного кода, что неудобно для просмотра. Поэтому брат Д. Гуа добавил раздел, чтобы показать полную версию кода, показанного в этом разделе.
Полный код класса Calculator выглядит следующим образом:
пакет com.diguage.books.concurrencycookbook.chapter1.recipe1;
/**
* Дата: 13 сентября 2013 г.
* Время: 21:42
*/
Калькулятор публичного класса реализует Runnable {
частный внутренний номер;
общедоступный калькулятор (число int) {
этот.номер = номер;
}
@Override
общественный недействительный запуск () {
для (int я = 0; я <10; я++) {
System.out.printf("%s: %d * %d = %d/n",
Thread.currentThread().getName(),
число, я, я * число);
}
}
}
Полный код основного класса
Скопируйте код кода следующим образом:
пакет com.diguage.books.concurrencycookbook.chapter1.recipe1;
/**
* Дата: 13 сентября 2013 г.
* Время: 19:46
*/
общественный класс Main {
public static void main(String[] args) {
для (int я = 0; я <10; я++) {
Калькулятор калькулятор = новый калькулятор (i);
Поток потока = новый поток (калькулятор);
поток.start();
}
}
}