1. Концепция потока: поток относится к потоку выполнения задачи от начала до конца. Поток обеспечивает механизм для выполнения задач. Для Java можно выполнять несколько потоков одновременно в программе, и эти потоки могут работать одновременно в многопроцессорной системе. Когда программа работает как приложение, интерпретатор Java запускает поток для метода Main ().
2. Параллельная и параллелизм:
(1) Параллелизм: в одной системе процессора несколько потоков делятся временем процессора, а операционная система отвечает за планирование и распределение ресурсов для них.
(2) Параллелизм: в многопроцессорной системе несколько процессоров могут одновременно запускать несколько потоков. Эти потоки могут работать одновременно одновременно. В отличие от параллелистики, только несколько потоков могут делиться временем процессора, и только один поток может работать одновременно.
3. Создание потоков:
(1) Основная концепция: каждая задача в Java является заполненным объектом. Чтобы создать задачу, класс задач должен сначала быть определен, и класс задач должен реализовать запускаемый интерфейс. И потоки - это по существу объекты, которые удобны для выполнения задач. Процесс выполнения потока - это выполнение метода run () в классе задач до конца.
(2) Создать потоки через запускаемый интерфейс:
а Определите класс задач для реализации runnable interface, реализуйте метод run () в методе Runnable Interface (run (), рассказывает системному потоку, как запустить) и определить конкретный код задания или логику обработки в методе run ().
беременный После определения класса задач создайте объект задачи для класса задач.
в Задача должна быть выполнена в потоке, создать объект класса протектора и передать объект класса задач, созданный ранее, который реализует выполняемый интерфейс к конструктору класса протектора в качестве параметра.
дюймовый Вызовите метод start () объекта класса протектора и запустите поток. Это приводит к выполнению метода задачи run (). Когда метод run () будет выполнен, поток завершится.
Пример кода:
пакет com.muzeet.mutithread; // Каждая задача является экземпляром запускаемого интерфейса. Задача является выполняемым объектом, а поток - это объект, который облегчает выполнение задачи. Вы должны создать класс задач и переопределить метод выполнения, чтобы определить задачу публичного класса ThreadDemo1 реализует runnable {private int countdown = 10; @Override // Переписать метод запуска и определить задачу public void run () {while (countdown-> 0) {System.out.println ("$" + thread.currentThread (). GetName () + "(" + countdown + ")"); }} // Вызов метода запуска запустит поток, что приведет к вызову метода выполнения в задаче. После выполнения метода выполнения поток завершает публичную статическую void main (string [] args) {runnable demo1 = new Threaddemo1 (); Thread Thread1 = новый поток (DEMO1); Thread Think2 = новый поток (Demo1); Thread1.start (); Thread2.start (); System.out.println ("Rocket Launch Countdown:"); }}Результаты запуска программы:
Ракетка запуска Rocket Countdown: $ Thread-0 (9) $ Thread-0 (8) $ Thread-0 (7) $ Thread-0 (6) $ Thread-0 (5) $ Thread-0 (4) $ Thread-0 (3) $ Thread-0 (2) $ Think-0 (1) $ Think-0 (0)
Запустите два объекта задачи одновременно:
public static void main (string [] args) {runnable demo1 = new ThreadDemo1 (); Runnable demo2 = new ThreadDemo1 (); Thread Thread1 = новый поток (DEMO1); Thread Think2 = новый поток (DEMO2); Thread1.start (); Thread2.start (); System.out.println ("Rocket Launch Countdown:"); }Результаты работы:
Ракета ракета $ Thread-0 (9) $ Thread-0 (8) $ Thread-0 (7) $ Thread-0 (6) $ THIND-1 (9) $ THIND-0 (5) $ THIND-1 (8) $ THIND-0 (4) $ THIND-1 (7) $ THIND-0 (3) $ Thrate-1 (6) $ Thrate-1 (5) $ Thrate-0 (2) $ Thrate-1 (4) $ Thrate-1 (3) $ THIND-1 (2) $ THIND-1 (1) $ THIND-1 (0) $ THIND-0 (1) $ THIND-0 (0)
(3) Унаследовать класс потока, чтобы создать потоку:
а Сначала создайте класс задач Extends Tread Class. Поскольку класс потоков реализует запускаемый интерфейс, настраиваемый класс задач также реализует метод запускаемого интерфейса и rerun (), который определяет конкретный код задачи или логику обработки.
беременный Создайте объект класса задач, который может использовать поток или запустить в качестве пользовательского типа переменной.
в Вызовите метод start () пользовательского объекта и запустите поток.
Пример кода:
пакет com.muzeet.mutithread; // Каждая задача является экземпляром запускаемого интерфейса. Задача представляет собой выполняемый объект, и поток может запускать объект. Класс заданий должен быть создан, и метод выполнения должен быть переопределен, чтобы определить Task Public Class ExtendFromThread Extends Thread {private int countdown = 10; @Override // Перепишите метод запуска и определите задачу public void run () {while (countdown-> 0) {System.out.println ("$" + this.getName () + "(" + countdown + ")"); }} // Вызов метода запуска запустит поток, что приведет к вызову метода выполнения в задаче. После выполнения метода выполнения поток завершает публичную статическую void main (string [] args) {extendFromThread Thread1 = new ExtendFromThread (); ExtendFromThread Thread2 = new ExtendFromThread (); Thread1.start (); Thread2.start (); System.out.println ("Rocket Launch Countdown:"); }}Результаты работы:
Ракета ракета $ Thread-0 (9) $ Thread-0 (8) $ Thread-0 (7) $ Thread-0 (6) $ THIND-0 (5) $ THIND-0 (4) $ THIND-0 (3) $ THEAD-0 (2) $ THIND-0 (1) $ THIND-0 (0) $ Thrate-1 (9) $ Thrate-1 (8) $ Thrate-1 (7) $ Thrate-1 (6) $ THIND-1 (5) $ THIND-1 (4) $ THIND-1 (3) $ THIND-1 (2) $ THEAD-1 (1) $ THIND-1 (0)
Один поток ждет, пока еще один поток заканчивается перед выполнением: при выполнении задачи PrintNum при печати номером 50 он поворачивается, чтобы выполнить задачу печати символа C, и только затем продолжает выполнять задачу печати номера после выполнения потока 4 -й поток4.
пакет com.muzeet.testThread; открытый класс printnum реализует runnable {private int lastnum; public printnum (int n) {lastnum = n; } @Override public void run () {// todo автоматическое сгенерированное метод потока потока 4 = новый поток (new PrintChar ('c', 40)); Thread4.start (); try {for (int i = 1; i <= lastnum; i ++) {System.out.println (""+i); if (i == 50) {thread4.join (); }}} catch (прерывание Exception e) {// todo автоматически сгенерированный блок e.printstacktrace (); }}}4. Сравнение двух методов (перепечатано)
Сначала мы анализируем результаты выходных данных двух методов. Мы также создаем два потока. Почему результаты разные?
Используя runnable interface для создания потоков, вы можете поделиться одним и тем же целевым объектом (treaddemo1tt = newTreaddemo1 ();), реализуя несколько идентичных потоков для обработки одного и того же ресурса. Когда первый поток выполняет задачу, обратный отсчет уже 0, поэтому второй поток не выведет. Унаследовав метод создания потоков по потоку, создаются два объекта класса задач, с их соответствующими переменными членами, и они не мешают друг другу.
Затем посмотрите на объяснение JDK:
Запустить интерфейс должен быть реализован классами, которые намереваются выполнять свои экземпляры через определенный поток. Класс должен определить метод без параметра, называемый run.
Целью разработки этого интерфейса является предоставление публичного протокола для объектов, которые хотят выполнять код при активном. Например, класс потоков реализует запускаемые. Активация означает, что нить была запущена и еще не остановилась.
Кроме того, Runnable обеспечивает метод активации для классов, которые не являются подклассами потока. Основная экземпляр потока и воспринимая себя в качестве выполнения цели, вы можете запустить класс, который реализует запуска. В большинстве случаев, если вы хотите просто переопределить метод run () и не переопределять другие методы потока, вы должны использовать выполняемый интерфейс. Это важно, потому что, если программист не намерен изменить или улучшить базовое поведение класса, для этого класса не следует создавать подкласс. (Рекомендуется использовать создание класса задач и реализацию запускаемого интерфейса вместо наследственного класса потока)
Принять наследство класса потоков:
(1) Преимущества: легко написать. Если вам нужно получить доступ к текущему потоку, вам не нужно использовать метод Thread.currentThread (). Вы можете получить текущий поток непосредственно, используя это.
(2) Недостатки: Поскольку класс потоков унаследовал класс потоков, он не может унаследовать другие родительские классы.
Используя метод выполнения интерфейса:
(1) Преимущества: только классы потоков реализуют запускаемый интерфейс, а также могут наследовать другие классы. Таким образом, несколько потоков могут использовать один и тот же целевой объект, поэтому он очень подходит для нескольких идентичных потоков для обработки одного и того же ресурса, так что код и данные ЦП могут быть разделены, чтобы сформировать четкую модель, которая лучше отражает идею, ориентированную на объект.
(2) Недостатки: программирование немного сложно. Если вам нужно получить доступ к текущему потоку, вы должны использовать метод Thread.currentThread ().
Суммировать
Выше приведено все о двух способах создания потоков в примерах многопоточного кода Java. Я надеюсь, что это будет полезно для всех. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!