Поток сравнения потоков Java, запускаемый, вызов
Java использует класс потока для представления потоков, и все объекты поля должны быть экземплярами класса потока или его подкласса. Функция каждого потока состоит в том, чтобы выполнить определенную задачу, которая фактически заключается в выполнении программы. Java использует тела выполнения потока для представления этого потока программы.
1. Унаследовать класс потока, чтобы создать поток
Шаги для начала многопоточного чтения следующие:
(1) Определите подкласс класса потока и переопределите метод run () класса. Тело метода метода run () представляет задачи, которые необходимо выполнить поток класса. Следовательно, метод run () называется корпусом выполнения потока.
(2) Создайте экземпляр подкласса потока, то есть создать объект потока.
(3) Вызовите метод Thread's Star (), чтобы запустить поток.
Соответствующие коды следующие:
/ *** Унаследовать внутренний класс потока, чтобы купить билеты, например*/ public Class FirstThread Extends Thread {private int i; частный билет int = 10; @Override public void run () {for (; i <20; i ++) {// Когда наследует поток, используйте это напрямую, чтобы получить текущий поток, getName () Получите имя текущего потока // log.d (Tag, getName ()+""+i); if (this.ticket> 0) {log.e (Tag, getName () + ", продажа билета: ticket =" + ticket--); }}}} private void starticketThread () {log.d (Tag, "starticketThread,"+thread.currentThread (). getName ()); FirstThread Thread1 = new FirstThread (); FirstThread Thread2 = new FirstThread (); FirstThread Thread3 = new FirstThread (); Thread1.start (); Thread2.start (); Thread3.start (); // Откройте 3 потока, чтобы купить билеты, каждая поток продана 10 билетов и в общей сложности 30 билетов}Результаты работы:
Вы можете видеть, что переменные голосования, введенные 3 потоками, не являются непрерывными. ПРИМЕЧАНИЕ. Билет - это свойство экземпляра FirstHread, а не локальная переменная, но поскольку программа должна создавать объект FirstHread каждый раз, когда он создает объект потока, все несколько потоков не делятся атрибутами экземпляра.
2. Реализуйте запускаемый интерфейс для создания потоков
Примечание. Поток публичного класса реализует выполнение
(1) Определите класс реализации запускаемого интерфейса и переопределите метод run () интерфейса. Тело метода метода run () также является телом выполнения потока потока.
(2) Создайте экземпляр класса запускаемого экземпляра. Этот экземпляр используется в качестве цели потока для создания объекта потока. Объект потока является реальным объектом.
Соответствующие коды следующие:
/ ** * Реализуйте выполненный интерфейс и создайте класс потока */ public class SecondThread реализует runnable {private int i; частный билет int = 100; @Override public void run () {for (; i <20; i ++) {// Если класс потока реализует выполняемый интерфейс // Получить текущий поток, вы можете использовать только Thread.currentThread (), чтобы получить текущий имя поток log.d (Tag, thread.currentThread (). GetName ()+""+I); if (this.ticket> 0) {log.e (Tag, think.currentThread (). getName () + ", продажа билета: билет =" + ticket--); }}}} private void starticketThread2 () {log.d (Tag, "starticketThread2,"+thread.currentThread (). getName ()); SecondThread SecondThread = new SecondThread (); // Создать новый поток через новый поток (Target, name) New Thread (SecondThread, «Покупатель билетов 1»). Start (); новая ветка (SecondThread, "Buyer 2"). start (); новая ветка (SecondThread, "Buyer 3"). start (); // хотя 3 потока были открыты, было куплено только 100 билетов}Результаты работы:
Вы можете видеть, что переменные голосования, введенные 3 потоками, непрерывны, и несколько потоков могут использовать свойства экземпляра класса потока, используя запускаемый интерфейс. Это связано с тем, что таким образом, выполняемый объект, созданный программой, является всего лишь целью потока, и несколько потоков могут совместно использовать одну и ту же цель, поэтому несколько потоков могут использовать свойства экземпляра одного и того же класса потока (что на самом деле должно быть целевым классом потока).
3. Создайте потоки, используя Callable и Future
Начиная с Java 5, Java обеспечивает призванный интерфейс, который является расширенной версией Runnable. Callable предоставляет класс Cally () метод, который можно использовать в качестве тела выполнения потока, но метод Call () более мощный.
(1) Метод Call () может иметь возвращаемое значение (2) Метод Call () может объявить исключение, брошенное
Следовательно, мы можем предоставить целевой объект Callable в качестве целевого потока, а исполнитель потока - метод Call () Callieble объекта. В то же время Java 5 предоставляет будущий интерфейс для представления возвращаемого значения метода Call () в интерфейсе Callable и предоставляет класс реализации FutureTask. Этот класс реализации реализует будущий интерфейс и реализует запускаемый интерфейс - цель, которую можно использовать в качестве класса потока.
Шаги запуска следующие:
(1) Создайте класс реализации разбираемого интерфейса и реализуйте метод Call (). Метод Call () будет использоваться в качестве тела выполнения потока, а метод Call () имеет возвратное значение.
(2) Создайте экземпляр класса Callable реализации и используйте класс FutureTask, чтобы обернуть вызываемый объект. Объект FutureTask инкапсулирует возвращаемое значение метода Call ().
(3) Создайте и запустите новый поток, используя объект FutureTask в качестве цели объекта потока.
(4) Вызовите метод get () объекта FutureTask, чтобы получить возвратное значение после выполнения детского потока.
Соответствующие коды следующие:
/ *** Используйте Callable для реализации Class Class*/ public Class. @Override public integer call () {for (int i = 0; i <10; i ++) {// Получить текущий поток, вы можете использовать только Thread.currentThread (), чтобы получить текущее имя потока // log.d (Tag, thread.currentThread (). GetName ()+""+i); if (this.ticket> 0) {log.e (Tag, think.currentThread (). getName () + ", билеты: ticket =" + ticket--); }} вернуть билет; }} private void starCallableThread () {theryThread TherdThread = new TherdThread (); FutureTask <Integer> task = new FutureTask <Integer> (третий разум); новый поток (задача, «поток с возвращающим значением»). start (); try {integer integer = task.get (); Log.d (Tag, "starcallableThread, возвращаемое значение детского потока ="+integer); } catch (прерванное искусство e) {e.printstacktrace (); } catch (executionException e) {e.printstackTrace (); }}Результаты работы:
Примечание. Метод Callable Call () позволяет объявлениям бросить исключения и допускает возвратные значения.
Программа, наконец, вызывает метод get () объекта FutureTask, чтобы вернуть возвращаемое значение метода Call (), в результате чего основной поток будет заблокирован, пока метод Call () не завершится и возвращается.
4. Сравнение трех способов
Создать мультипотчики путем наследственного класса потоков
Недостатки: класс потоков был унаследован не может быть унаследован от других родительских классов.
Преимущества: просто написать
Создать многопоточное использование метода наследования запускаемых и призывных интерфейсов
Недостатки: программирование немного сложно. Если вам нужно получить доступ к текущему потоку, вы должны использовать Thread.currentThread ()
Преимущества:
(1) Он также может наследовать другие классы (2) Несколько потоков могут использовать целевой объект, поэтому он очень подходит для нескольких идентичных потоков для обработки одного и того же ресурса, тем самым разделяя ЦП, код и данные, чтобы сформировать четкую модель, которая лучше отражает объектно-ориентированную идею класса.
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!