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