В этом резюме моего понимания связи между потоками в многопоточном формате Java в основном обсуждается связь между потоками в коде в сочетании с текстом. Следовательно, я перечислил некоторые примеры кодов в книге, и конкретный контент заключается в следующем
① Синхронизация
Синхронизация, упомянутая здесь, относится к нескольким потокам с использованием синхронизированного ключевого слова для реализации связи между потоками.
Справочный пример:
открытый класс myObject {синхронизированный public void methoda () {// что -то делать ....} Синхронизированный public void methodb () {// Делать что -то другое}} public class threada extens {private myobject object; // Опустить конструктор @override public run run () {super.run (); //; Object.Methoda (); }} public Class Threatb extends Thread {private MyObject объект; // Опустите конструктор @Override public void run () {super.run (); object.methodb (); }} открытый класс run {public static void main (string [] args) {myObject object = new myObject (); // поток A и поток B Удерживает один и тот же объект: объект Threada a = new Threada (Object); Threatb B = new ThreatB (Object); A.Start (); B.Start (); }}Поскольку поток A и поток B удерживают объект объекта одного и того же класса MyObject, хотя эти два потока должны вызывать различные методы, они выполняются синхронно. Например, поток B должен ждать потока A, чтобы выполнить метод methoda (), прежде чем он сможет выполнить метод MethodB (). Таким образом, нить A и нить B осознают общение.
Этот метод по сути является коммуникацией «общей памяти». Несколько потоков должны получить доступ к одной и той же общей переменной, и тот, кто получает блокировку (получает права доступа), может выполнить ее.
② Какова метод опроса
Код заключается в следующем:
Импорт java.util.arraylist; import java.util.list; открытый класс mylist {private list <string> list = new Arraylist <string> (); public void add () {list.add ("elements"); } public int size () {return list.size (); }} import mylist.mylist; public Class Threada Extends Thread {private MyList List; public Threada (MyList List) {super (); this.list = list; } @Override public void run () {try {for (int i = 0; i <10; i ++) {list.add (); System.out.println («добавлен» + (i + 1) + «элементы»); Thread.sleep (1000); }} catch (прерывание Exception e) {e.printStackTrace (); }}} import mylist.mylist; public class threatb extends thread {private mylist List; public Thinteb (MyList List) {super (); this.list = list; } @Override public void run () {try {while (true) {if (list.size () == 5) {System.out.println ("== 5, поток B готов выйти"); выбросить новый прерываний (); }}} catch (прерывание Exception e) {e.printstackTrace (); }}} import mylist.mylist; import extthread.threada; import extreadb. Threada a = new Threada (Service); a.setname ("a"); A.Start (); Threatb B = новый ThreatB (Service); b.setname ("b"); B.Start (); }}Таким образом, потока постоянно меняет условия, и потоковая потока постоянно обнаруживает, является ли это условием (list.size () == 5) верно в соответствии с оператором, тем самым реализуя связь между потоками. Но этот метод будет тратить ресурсы процессора. Причина, по которой он тратит ресурсы, заключается в том, что, когда планировщик JVM передает ЦП к потоку B для выполнения, он не выполняет какую -либо «полезную» работу, но просто постоянно проверяет, является ли определенное условие истинно. Это похоже на реальную жизнь, кто -то продолжает смотреть на то, идет ли телефон на экране его мобильного телефона, а не: делать что -то еще, когда идет телефон, звон уведомит его, что телефон идет. Что касается влияния опроса потоков, пожалуйста, обратитесь к: каковы последствия потока, выполняющего мертвую петлю на Java
③ wait/wwait/уведомление механизм
Код заключается в следующем:
Импорт java.util.arraylist; import java.util.list; public class mylist {private Static List <string> list = new ArrayList <string> (); public static void add () {list.add ("AnyString"); } public static int size () {return list.size (); }} public Class Threada Extends Thread {Private Object Lock; public Threata (объект блокировка) {super (); this.lock = lock; } @Override public void run () {try {synchronized (lock) {if (mylist.size ()! = 5) {System.out.println ("wat Begin" + System.currentTimeMillis ()); lock.wait (); System.out.println ("wat End" + System.currentTimeMillis ()); }}} catch (прерывание Exception e) {e.printstackTrace (); }}} публичный класс Threatb Extends Thread {Private Object Lock; public Thintb (Object Lock) {super (); this.lock = lock; } @Override public void run () {try {synchronized (lock) {for (int i = 0; i <10; i ++) {mylist.add (); if (mylist.size () == 5) {lock.notify (); System.out.println ("уведомлен"); } System.out.println ("добавлен" + (i + 1) + "элементы!"); Thread.sleep (1000); }}} catch (прерывание Exception e) {e.printstackTrace (); }}} открытый класс run {public static void main (string [] args) {try {Object lock = new Object (); Threata a = new Threada (Lock); A.Start (); Thread.sleep (50); ThintB B = новый ThinteB (LOCK); B.Start (); } catch (прерванное искусство e) {e.printstacktrace (); }}}Наденьте A, чтобы дождаться удовлетворения определенного условия, прежде чем выполнять операцию. Поток B добавляет элементы в список и изменяет размер списка.
Как общаются А и В? Другими словами, как Think знает, что list.size () уже 5?
Здесь мы используем методы wait () и notify () объекта класса.
Когда условие не будет выполнено (list.size ()! = 5), назит вызовы ждать (), чтобы отказаться от процессора и входить в состояние блокировки. --- Не берите процессор, как ② Why Why Offulling
Когда условие выполняется, вызовы потока B уведомляют (), чтобы уведомлять поток A. Так называемый поток уведомлений A-проснуться поток A и позволить ему ввести в бегемое состояние.
Одним из преимуществ этого метода является то, что использование ЦП было улучшено.
Но есть некоторые недостатки: например, сначала поток B выполняется, добавляет 5 элементов одновременно и вызовы notify () для отправки уведомления, а потока A все еще выполняется; Когда резьбу a выполняется и вызовы Wait (), он никогда не будет пробужден. Потому что поток B уже выпустила уведомление и не будет выпускать никаких уведомлений в будущем. Это показывает, что уведомление слишком рано и нарушит логику выполнения программы.
Выше приведено все об этой статье, я надеюсь, что для всех будет полезно изучать программирование Java.