1. 세마포어
먼저 세마포어에 대해 이야기합시다. Semaphore는 동시에 액세스 할 수있는 리소스 수를 제어하고 arceire ()를 통해 라이센스를 얻고, 없는지 대기하고, Release ()는 라이센스를 릴리스 할 수 있습니다. 일반적으로 동시 스레드의 수와 스레드 간의 상호 배제를 제어하는 데 사용됩니다. 또한 재진입 락은이 기능을 구현할 수 있지만 구현은 더 복잡합니다.
이 기능은 화장실의 5 개 구덩이와 유사합니다. 10 명이 화장실에 가야한다면 얼마나 많은 사람들이 화장실에 동시에 갈 수 있습니까? 동시에 5 명만이 그것을 점령 할 수 있습니다. 다섯 사람 중 하나가 옆으로 움직일 때, 다른 5 명 중 하나가 기다릴 수 있습니다. 또한, 5 명 중 대기중인 5 명 중에서, 그들은 무작위로 우선 순위 기회를 얻을 수 있거나, 첫 번째로오고 도착할 수있는 기회를 얻을 수 있습니다.
단일 세마포어 객체는 뮤텍스의 기능을 구현할 수 있으며, 한 스레드로 얻을 수 있고 다른 스레드에 의해 릴리스 될 수 있습니다. 이 경우 교착 상태 회복의 경우 적용 할 수 있습니다.
예:
/** * @description : * @param @param args * @return void return 유형 */public static void main (String [] args) {// 스레드 풀 ExecutorService exec = executors.newCachedThreadPool (); // 5 개의 스레드 만 최종 세마포어 SEMP = 새로운 세마포어 (5)에 액세스 할 수 있습니다. // 20 클라이언트 액세스 (int index = 0; index <20; index ++) {최종 int no = index; runnable run = new Runnable () {public void run () {try {// get get 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. 그러면 다른 물체 가이 채워진 튜브의 내용을 읽을 수 있습니다.
코드에서
package com.jx.test; import java.io.ioexception; import java.nio.bytebuffer; import java.nio.channels.pipe; public class testpipe {/** * @description : * @param @param args * @return void return * @throws ioexception (strows io exception) [] 파이프 라인 파이프 파이프 = 파이프. 옵션 (); 최종 파이프 .sinkChannel psic = pipe.sink (); // 파이프 라인에 데이터를 작성하려면 싱크 채널 최종 파이프에 액세스해야합니다 .Sourcechannel psoc = pipe.source (); 파이프 라인의 데이터에 액세스 할 수 있어야합니다. {system.out.println ( "send ......"); // 스레드를 만들고 파이프의 쓰기 포트 파이프를 사용하여 지정된 바이 테 버퍼의 내용을 파이프 라인 res = psic.write (bytebuffer .wrap ( "hello, pip! test communication ..." " res);} catch (예외 e) {e.printstacktrace ();}}}; 스레드 tpreader = new Thread () {public void run () {int bbuffersize = 1024 * 2; bytebuffer bbuffer = bytebuffer.Allother (bbbuffersize); systal.out.out.println (recive. an and an and an and an and an and an and an and an). 파이프 라인 파이프의 SourceChannel Type PSOC 지정된 바이트 버퍼 int res = psoc.read (bbuffer)로 파이프 라인의 내용을 읽으려면; // 데이터는 System.out.println ( "recive :"+res+"content :"+BytebufferToString (bbuffer));} catch (예외 E)가 아닙니다. {e.printstacktrace ();}}}; tpwriter.start (); tpreader.start ();}/***bytebuffer-> string의 변환 함수*/public statt bytebuffertoString (bytebuffer content) {if (content == null || content.limit () <= 0 | 0 | content.remaining ())) {system.out.println ( "존재하지 않거나 내용이 비어 있지 않거나 컨텐츠가 비어 있지 않습니다!"); return null;} int contentsize = content.limit () - content.remaining (); stringbuffer (); for (int i = 0; i <contentsize; i); resultstr.toString ();}}요약
위의 모든 것은 Java 프로그래밍이 기사 간 커뮤니케이션 및 세마포어 코드의 예제에 관한 것입니다.이 기사에서는 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!