1。セマフォ
最初にセマフォについて話しましょう。 Semaphoreは、同時にアクセスできるリソースの数を制御し、acchire()を介してライセンスを取得し、noがある場合は待機し、ライセンスをリリースします。通常、同時スレッドの数とスレッド間の相互除外を制御するために使用されます。さらに、ReentrantLockはこの機能を実装することもできますが、実装はより複雑です。
この機能は、トイレの5つのピットすべてに似ています。 10人がトイレに行かなければならない場合、何人の人が同時にトイレに行くことができますか?同時に、それを占有できるのは5人だけです。 5人のいずれかが脇に移動すると、他の5人のうちの1人が待っています。さらに、待っている5人のうち、彼らはランダムに優先機会を得るか、最初に来て到着する順に機会を得ることができます。
単一のセマフォオブジェクトは、ミューテックスの関数を実装でき、1つのスレッドで取得して別のスレッドでリリースできます。これは、デッドロック回復の場合に適用できます。
例:
/** * @description: * @param @param args * @return void return type */public static void main(string [] args){//スレッドプールexecutorservice = executors.newcachedthreadpool(); // 5つのスレッドのみが最終的なセマフォにアクセスできますsemp = new Semaphore(5); //(int index = 0; index <20; index ++){final int no = index; runnable run = new runnable(){public void run(){try {//許可semp.acquire(); System.out.println( "アクセスを取得:" + no); thread.sleep((long)(math.random() * 10000)); //アクセスした後、semp.release()をリリースします。 system.out.println( "残りのままになります signals----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------出力結果(なぜこのように出力するのかを考えてください):
アクセスを取得する:1アクセスを取得する:5アクセスを取得する:2アクセスを取得する:3アクセスを取得: Signal-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 13残りの信号 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2。パイプをスレッド間のブリッジとして使用します
パイプにはソースチャネルとシンクチャネルがあります。データはシンクチャネルに書き込まれ、ソースチャネルから読み取ります。 1つと1つ。まず使用方法を学びましょう。
java.nio.channelsの下では、このクラスはNIOメソッドのデータ通信方法が使用されていることを示しているため、バッファーを使用してデータをバッファーします。
パイプの原理のイラスト:
パイプは空のパイプです。この空のパイプの一方の端は、パイプの内側から読み取ることができ、もう一方の端はパイプに書き込むことができます。
操作プロセス:
1.最初に、この空のチューブに書き込むオブジェクトが必要です。どこに書く?この空のパイプには、このパイプにある小さなスペースがあります。
書くときは、パイプ自体に含まれるスペースに書き込まれます。このスペースサイズは1024バイトです。
2。その後、別のオブジェクトがこの充填チューブの内容を読み取ることができます。
コードで
パッケージ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 type * @return return ioexceptionパイプラインパイプパイプ= pipe.open(); final pipe.sinkchannel psic = pipe.sink(); //パイプラインにデータを書き込むには、シンクチャネル最終パイプにアクセスする必要があります。sourcechannelsoc= pipe.source(); {system.out.println( "send ......"); //スレッドを作成してパイプの書き込みポートパイプを使用して、指定されたbytebufferのコンテンツをパイプラインint res = psic.write(bytebuffer .wrap( "hello、pipe or test communication ......"); + res);} catch(Exception e){e.printstacktrace();}}}}}; shood tpreader = new void run(){int bbuffersize = 1024 * 2; bytebuffer bbuffer = bytebuffer.allocate(bbuffersize); try try {system.tprintln(パイプラインパイプの入力を読む。SourcechannelタイプPSOCを読むには、指定されたbytebuffer int res = psoc.read(bbuffer); //データはsystem.out.println( "recive size:"+res+"コンテンツ:"+bytebuffertostring(bbuffer); {e.printstacktrace();}}}}; tpwriter.start(); tpreader.start();}/***bytebuffer-> stringの変換機能*/public static string bytebuffertostring(bytebufferコンテンツ){if(content = = null || content.limit content.remaining())){system.out.println( "存在しないか、コンテンツが空!") resultStr.toString();}}要約します
上記は、この記事では、Javaプログラミングインタースレッドコミュニケーションとセマフォコードの例についてのすべてです。すべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!