従来の同期開発モデルでは、関数を呼び出すと、データは関数のパラメーターを通じて渡され、最終的な計算結果は関数の戻り値を通じて返されます。ただし、マルチスレッド非同期開発モードでは、データの送信と返信が同期開発モードとは大きく異なります。スレッドの実行と終了は予測できないため、データを転送および返すときに、関数のような関数パラメーターや return ステートメントを介してデータを返すことはできません。この記事では、上記の理由からスレッドにデータを渡すためのいくつかの方法を紹介します。次の記事では、スレッドからデータを返す方法を紹介します。
何かを最初に受け取りたい場合は、最初にそれを与えなければなりません。一般に、スレッドを使用する場合は、いくつかの初期化データが必要であり、スレッドはこれらのデータを使用して処理し、結果を返します。このプロセスで最初に行うことは、データをスレッドに渡すことです。
1. コンストラクターを介してデータを渡す
スレッドを作成するときは、Thread クラスまたはそのサブクラスのインスタンスを作成する必要があります。したがって、start メソッドを呼び出す前に、スレッド クラスのコンストラクター メソッドを通じてデータをスレッドに渡すことを考えるのは難しくありません。そして、スレッドで使用するためにクラス変数を使用して受信データを保存します (実際には run メソッドで使用されます)。次のコードは、コンストラクター メソッドを通じてデータを渡す方法を示しています。
package mythread; public class MyThread1 extends Thread { private String name; public MyThread1(String name) { this.name = name; } public void run() { System.out.println("hello " + name); } public static void main(String[] args) { Thread thread = new MyThread1("world"); thread.start(); } }
このメソッドはスレッド オブジェクトの作成中にデータを渡すため、データはスレッドの実行前にすでに配置されているため、データはスレッドの実行後に転送されます。スレッドが実行中です。より複雑なデータを渡したい場合は、コレクションやクラスなどのデータ構造を使用できます。コンストラクターメソッドを使用してデータを転送する方が安全ですが、転送するデータが大量になると非常に不便になります。 Java にはデフォルト パラメータがないため、デフォルト パラメータと同様の効果を実現したい場合は、オーバーロードを使用する必要があります。これにより、コンストラクタ自体が複雑になるだけでなく、コンストラクタの数も大幅に増加します。したがって、この状況を回避するには、クラス メソッドまたはクラス変数を介してデータを渡します。
2. 変数とメソッドを介してデータを渡す
データをオブジェクトに渡すには、通常 2 つの機会があります。1 つ目は、オブジェクトの作成時にコンストラクター メソッドを介してデータを渡すことです。クラス内のデータ。パブリック メソッドまたは変数 (フィールドとも呼ばれます)。次に、オブジェクトを作成した後、オブジェクト インスタンスを通じて値を 1 つずつ割り当てます。次のコードは MyThread1 クラスを変更したもので、setName メソッドを使用して name 変数を設定します。
package mythread; public class MyThread2 implements Runnable { private String name; public void setName(String name) { this.name = name; } public void run() { System.out.println("hello " + name); } public static void main(String[] args) { MyThread2 myThread = new MyThread2(); myThread.setName("world"); Thread thread = new Thread(myThread); thread.start(); } }
3. コールバック関数を介してデータを渡す
上で説明したスレッドにデータを渡す 2 つの方法は、最も一般的に使用されます。ただし、どちらのメソッドもメイン メソッドのスレッド クラスにデータを積極的に渡します。スレッドの場合、このデータは受動的に受信されます。ただし、一部のアプリケーションでは、スレッドの実行中にデータを動的に取得する必要があります。たとえば、次のコードの run メソッドで 3 つの乱数が生成され、これら 3 つの乱数の合計が process メソッドで計算されます。 Work クラスの値を取得し、Data クラスの値を通じて結果を返します。この例からわかるように、値を返す前に 3 つの乱数を取得する必要があります。つまり、この値を事前にスレッド クラスに渡すことはできません。
package mythread; class Data { public int value = 0; } class Work { public void process(Data data, Integer numbers) { for (int n : numbers) { data.value += n; } } } public class MyThread3 extends Thread { private Work work; public MyThread3(Work work) { this.work = work; } public void run() { java.util.Random random = new java.util.Random(); Data data = new Data(); int n1 = random.nextInt(1000); int n2 = random.nextInt(2000); int n3 = random.nextInt(3000); work.process(data, n1, n2, n3); // 使用回调函数 System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+" + String.valueOf(n3) + "=" + data.value); } public static void main(String[] args) { Thread thread = new MyThread3(new Work()); thread.start(); } }
上記のコードの処理メソッドはコールバック関数と呼ばれます。本質的に、コールバック関数はイベント関数です。 Windows API では、API を呼び出すプログラム間でデータをやり取りするためにコールバック関数がよく使用されます。したがって、コールバック関数を呼び出すプロセスは、イベントをトリガーする本来のプロセスです。この例では、 process メソッドを呼び出してデータを取得することは、 run メソッドでイベントをトリガーすることと同じです。
マルチスレッドにパラメータを渡す Java の 3 つの方法の詳細については、PHP 中国語 Web サイトの関連記事に注目してください。