1. スレッドに参加します:
スレッドの実行中、大きな問題を多数の小さな問題に分割し、それぞれの小さな問題にスレッドを割り当てるなど、別のスレッドを最初に実行したい場合がありますが、すべての小さな問題が処理された後は、メインスレッドにさらなる操作を実行させます。このとき、メインスレッド内の他のスレッドの join() メソッドを呼び出して、呼び出しスレッド (ここではメインスレッド) をブロックできます。
サンプルコード:
次のようにコードをコピーします。
パッケージ org.frzh.thread;
public class JoinThread extends Thread{
// スレッドの名前を設定するためのパラメータ化されたコンストラクタを提供します
public JoinThread(文字列名) {
スーパー(名前);
}
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args) {
// 子スレッドを開始します
new JoinThread("新しいスレッド").start();
for (int i = 0; i < 100; i++) {
if (i == 20) {
JoinThread jt = new JoinThread("参加するスレッド");
jt.start();
//メインスレッドは jt スレッドの join メソッドを呼び出します。その後、メインスレッドは jt の実行が完了するまで待機してから実行する必要があります。
試す {
jt.join();
} catch (InterruptedException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " " +i);
}
}
}
元々は 3 セットのスレッド (2 つのサブスレッドと 1 つのメインスレッド) がありました。i=20 の場合、メインスレッドはブロックされ、「結合されたスレッド」が実行されるまで待機する必要がありました。その後実行されるスレッドは 2 つだけです。
join() メソッドの 3 つのオーバーロード形式:
join(): 結合されたスレッドの実行が終了するまで待ちます。
join(long millis): 結合されたスレッドの実行を待機する最長時間はミリ秒です。それ以降は、結合されたスレッドの実行が終了していなくても、それ以上待機することはありません。
join(long millis, int nanos): 結合されたスレッドの実行を待機する最大時間は、millis ミリ秒 + nanos マイクロ秒です。 (この方法は基本的には役に立ちません)。
2: バックグラウンドスレッド:
バックグラウンドで実行されるスレッドがあり、そのタスクは他のスレッドにサービスを提供することであり、このスレッドは「バックグラウンド スレッド」、「デーモン スレッド」、または「エルフ スレッド」と呼ばれます。すべてのフォアグラウンド スレッドが終了すると、バックグラウンド スレッドも自動的に終了します。
サンプルコード:
次のようにコードをコピーします。
パッケージ org.frzh.thread;
public class DaemonThread extends Thread{
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(getName() + " " +i);
}
}
public static void main(String[] args) {
DaemonThread dt = new DaemonThread();
// このスレッドをバックグラウンド スレッドとして設定します
dt.setDaemon(true);
dt.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
//フォアグラウンド スレッドが終了すると、バックグラウンド スレッド dt も終了するため、実行されません 999
}
}
メイン スレッドはデフォルトでフォアグラウンド スレッドに設定され、フォアグラウンド スレッドによって作成されたサブスレッドはデフォルトでフォアグラウンド スレッドに設定され、バックグラウンド スレッドによって作成されたサブスレッドはデフォルトでバックグラウンド スレッドに設定されます。
3. スレッドスリープ (スリープ):
前の join メソッドは、呼び出し元のスレッドに、結合されたスレッドの実行が完了するまで待機させてから続行するようにします。一方、sleep() メソッドは、呼び出し元のスレッドを一定期間ブロックしてから、再び準備完了状態になり、待機状態になるのを待ちます。予定されています。したがって、プログラムの実行を一時停止するためによく使用されます。
サンプルコード:
次のようにコードをコピーします。
パッケージ org.frzh.thread;
java.util.Dateをインポートします。
パブリック クラス SleepThread{
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("現在の時刻: " + new Date());
試す {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}
}
sleep() メソッドの 2 つのオーバーロード メソッド:
static void sleep (long millis): 現在のスレッドをミリ秒間一時停止し、ブロッキング状態に入ります。この方法は、システム タイマーとスレッド スケジューラの精度と精度の影響を受けます。
static void sleep (long millis, int nanos): ミルミリ秒 + ナノマイクロ秒を一時停止し、ブロック状態に入ります。これは、システム タイマーとスレッド スケジューラの精度にも影響されます。基本的には必要ありません。
4.糸の歩留まり:
yield() メソッドは sleep メソッドに似ていますが、現在実行中のスレッドを一時停止することもできますが、スレッドをブロックするのではなく、準備完了状態に移行するだけです (ブロック状態ではないことに注意してください)。 yield() メソッドは、同じ優先度またはそれより高い優先度を持つスレッドにのみ実行の機会を与えるため、このメソッドを呼び出した後、スレッドが再スケジュールされて実行を継続する可能性があります。
サンプルコード:
次のようにコードをコピーします。
パッケージ org.frzh.thread;
public class YieldThread extends Thread{
public YieldThread() {
}
public YieldThread(文字列名) {
スーパー(名前);
}
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + " " +i);
if (i == 20) {
// 現在のスレッドの結果は次のとおりです。
スレッド.yield();
}
}
}
public static void main(String[] args) {
// 2 つの同時スレッドを開始します
YieldThread yt1 = new YieldThread("Advanced");
// yt1 を最高の優先度に設定します
yt1.setPriority(Thread.MAX_PRIORITY);
yt1.start();
YieldThread yt2 = new YieldThread("低レベル");
yt2.setPriority(Thread.MIN_PRIORITY);
yt2.start();
/*
* スレッドに優先順位が設定されていない場合、2 つのスレッドの優先順位は同じであるため、2 つのスレッドは交互に実行され、yield が呼び出されるときはもう一方のスレッドが実行されます。
* ただし、2 つのスレッドにそれぞれ上記の優先順位を設定した後、i=20 のときに、yield メソッドが呼び出されるだけなので、高度なスレッドの実行が開始されます。
* 同じ優先度またはそれより高い優先度のスレッドに実行の機会を与えるため、この時点では高レベルのスレッドはまだ実行されており、低レベルのスレッドには与えられません。
*/
}
}
5: スレッドの優先順位を変更します。
これは比較的単純で、インスタンス メソッドの setPriority(int priority) メソッドを呼び出すだけです。各スレッドのデフォルトの優先順位は親スレッドと同じで、メインスレッドのデフォルトは通常の優先順位 (5) です。 Java には 1 から 10 までの優先順位があり、次の 3 つの静的定数も使用できます。
MAX_PRIORITY:10
MIN_PRIORITY:1
NORM_PRIORITY:5
注: Java では 10 個の優先順位が提供されていますが、システムによってサポートされる優先順位は異なるため、1 から 10 までの数値を直接使用することは避け、移植性を確保するために静的定数を使用するようにしてください。