優れた研究室のマルチスレッド(単純、理解可能で、自明ではなく、国民経済に役立つ)はまれです。 Javaの基本マルチスレッドに関する1つの条件と4つの実験室作業を提供します。
オンライン教育プラットフォームudemy.comで
Scala for Java Developersコースも教え
ています(Coursera / EdXに似ています)。
条件
これは、InputStreamからOutputStreamへの
シングルスレッドバイトコピーの実装です。 コピー(...)メソッドを呼び出すスレッドでコピーが発生します
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class CopyUtil { public static void copy(InputStream src, OutputStream dst)throws IOException{ try (InputStream src0 = src; OutputStream dst0 = dst) { int b; while ((b = src.read()) != -1) { dst.write(b); } } } }
これは、InputStreamからOutputStreamへの
シングルスレッドコピー配列の実装です。 コピー(...)メソッドを呼び出すスレッドでコピーが発生します
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class CopyUtil { public static void copy(InputStream src, OutputStream dst)throws IOException{ byte[] buff = new byte[128]; try (InputStream src0 = src; OutputStream dst0 = dst) { int count; while ((count = src.read(buff)) != -1) { dst.write(buff, 0, count); } } } }
これは、InputStreamからOutputStreamへの
配列を
持つマルチスレッドコピー機の実装です。 別の新しいストリームで読み取りと書き込みを開始し、それらをリーダーからライターにデータを転送するためのブロッキング制限キューに接続します
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.atomic.AtomicReference; public class CopyUtil { public static void copy(final InputStream src, final OutputStream dst) throws IOException {
次のテストを使用して、コピーを検証できます。
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Arrays; import java.util.Random; public class Test { public static void main(String[] args) throws IOException { Random rnd = new Random(0); byte[] testData = new byte[64 * 1024]; rnd.nextBytes(testData); ByteArrayOutputStream dst = new ByteArrayOutputStream(); CopyUtil.copy(new ByteArrayInputStream(testData), dst); if (!Arrays.equals(testData, dst.toByteArray())) { throw new AssertionError("Lab decision wrong!"); } else { System.out.println("OK!"); } } }
タスク#1
最後の2スレッドソリューションでは、読み取り用と書き込み用の2つのストリームを開始します。 読み取りが新しいストリームで実行され、記録がコピー(...)を呼び出したストリームによって実行されるようにコードを書き換えます。 ちなみに、バッファの受信側のストリームはいつデータが終了したかを知っているため、いくつかの結合を取り除くことができます。
タスク#2
最後の2スレッドソリューションでは、リーダーは絶えず新しいバイト[]を作成し、バッファーをライターに渡し、GCに送信します。 ライターからリーダーへの空のバッファーの個別のリバースキューを作成します。
タスク#3
3つのコード例すべてで、1人のリーダーから1人のライターへのデータ転送を実装しました。 1つのリーダーから多くのライターにデータを転送するためのマルチスレッドソリューションを実装します。 すべてのライターは同一のデータを受け取ります。 リーダーとライターはそれぞれ独自のスレッドで動作します。 ライターごとにデータのコピーを個別に作成しないでください-ライターはすべてのバッファーの1つから読み取ることができますが、これらのバッファーを異なるキューに同時に保存できます(リーダーから各ライターに個別のキューが実行されます)。
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class CopyUtil { public static void copy(InputStream src, OutputStream ... dst) throws IOException {
タスク#4
前のタスク#3を実行しますが、中心部でリーダーと光線がライターに発するスタートポロジとリングトポロジを形成しません。 リーダーとライターが円を描くように並んで、バッファーを渡します。 リーダーは最初のライター、最初のライターは2番目、最後のライターはリーダーです。 そして、リーダーはバッファを再利用できます。
連絡先
Javaコアプログラミングコース(オンラインコース)を開発してい
ます 。
メール:GolovachCourses@gmail.com
スカイプ:GolovachCourses