1. Семфор
Давайте сначала поговорим о семафоре. Semaphore может контролировать количество ресурсов, к которым можно получить доступ одновременно, получить лицензию через acpire (), подождать, если нет, и выпуск () выпускает лицензию. Обычно используется для контроля количества одновременных потоков и взаимного исключения между потоками. Кроме того, повторный зал может также реализовать эту функцию, но реализация более сложна.
Функция аналогична всем 5 ям в туалете. Если 10 человек должны пойти в туалет, то сколько людей могут пойти только в туалет одновременно? В то же время только 5 человек могут занять это. Когда кто -либо из пяти человек отодвигается в сторону, один из 5 человек, ожидающих, может занять его. Кроме того, среди 5 человек, ожидающих, они могут получить приоритетные возможности случайным образом, или они могут получить возможности, чтобы сначала прийти, а затем прибыть.
Один объект Semaphore может реализовать функцию Mutex, и он может быть получен с помощью одного потока и выпустить другим потоком. Это может быть применено в некоторых случаях восстановления тупика.
пример:
/** * @description: * @param @param args * @return void return type */public static void main (string [] args) {// recemorservice exectors = executors.newcachedthreadpool (); // Только 5 потоков могут получить доступ к окончательному семафорному SEMP = новый семафор (5); // Моделируют 20 клиентского доступа для (int index = 0; index <20; index ++) {final int no = index; Runnable run = new Runnable () {public void run () {try {// получить разрешение semp.acquire (); System.out.println ("получить доступ:" + нет); Thread.sleep ((Long) (Math.Random () * 10000)); // после доступа, выпустить semp.release (); System.out.println («Оставайтесь signals----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Результат вывода (подумайте, почему он выходит так):
Получить доступы: 1 Получить доступ: 5 Получить доступы: 2 Получить доступ: 3 Получить доступ: 0 оставшееся доступно Signal-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 13 оставшихся сигналов --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
2. Используйте трубу в качестве моста между резьбами
У трубы есть исходный канал и канал раковины. Данные будут записаны в канал по раковине и прочитаны из исходного канала. Один и один. Давайте сначала научитесь его использовать.
Стоит отметить, что при java.nio.channels этот класс показывает, что используется метод передачи данных метода NIO, поэтому используйте буфер для буфера.
Иллюстрация принципа трубы:
Труба - пустая труба. Один конец этой пустой трубы может быть прочитана изнутри трубы, а другой конец может быть записан в трубу.
Процесс работы:
1. Во -первых, должен быть объект, чтобы написать его в эту пустую трубку. Где написать? Эта пустая труба имеет небольшое пространство, прямо в этой трубе.
При написании он записан в пространство, содержащееся в самой трубе. Этот размер пространства составляет 1024 байта.
2. Затем другой объект может считать содержимое этой заполненной трубки.
На коде
пакет com.jx.test; импорт java.io.ioexception; import java.nio.bytebuffer; импорт java.nio.channels.pipe; public class testpipe {/** * @description: * @param @param args * @return void return type * @throws ioexcept трубопроводная труба труба = pipe.open (); final pipe.sinkChannel psic = pipe.sink (); // Чтобы записать данные в трубопровод, вам необходимо получить доступ к каналу раковины. {System.out.println («Отправить ......»); // Создать поток и использовать трубную порту трубы. res);} catch (Exception e) {e.printstackTrace ();}}}; Thread tpreader = new Thread () {public void run () {int bbuffersize = 1024 * 2; bytebuffer bbuffer = bytebuffer.allocate (buffersize); из трубопровода. Тип SourceChannel PSOC для чтения содержимого в трубопроводе в указанный ByteBuffer int res = psoc.read (bbuffer); // Данные не являются system.out.println («Размер реципии:«+res+»Содержание:«+bytebuffertoString (buffer)); {e.printstacktrace ();}}}; tpwriter.start (); tpreader.start ();}/***bytebuffer-> Функция преобразования строки*/public Static String bytebuffertoString (bytebuffer content) {if content == null || content.limit () <) <= 0 | Content.Reming ()))) {System.out.println ("Не существует или содержание пусто! ResultStr.ToString ();}}Суммировать
Выше приведено примеры программирования Java программирования межтотового общения и кода семафора в этой статье, я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!