例えばメソッドpublic static void sleep(long millis)
。このメソッドは現在のスレッドをスリープさせますが、どのスレッドが現在のスレッドであるかをどのように知るのでしょうか? 静的メソッドはオブジェクトに依存せず、クラスに属します。では、このメカニズムはどのように機能するのでしょうか?
5 に答える
このメソッドは現在のスレッドをスリープさせますが、どのスレッドが現在のスレッドであるかをどのように知るのでしょうか?
現在のスレッドは、基盤となるオペレーティング システム (またはスレッド システム) によって管理されます。基になる (システムに依存する) スレッドの実装は、現在のスレッドへのハンドルを提供します。
POSIXスレッドの場合、現在実行中のスレッドのスレッド ID を返すAPI 呼び出しpthread_self()があります。
Thread.currentThread()
最終的にこの C 関数を呼び出して、スレッド ID を JavaThread
オブジェクトにラップし、それを返すことを考えることができます。MS Windowsの場合、現在実行中のスレッドの Windows ハンドルを返すAPI 呼び出しGetCurrentThread()があります。繰り返しますが、最終的にこの C 関数を呼び出して、返される Java オブジェクトで
Thread.currentThread()
ハンドルをラップすることを考えることができます。Thread
native
メソッドは特殊です。Java API を超えてアクセスできます。
この場合、現在のスレッドに。このメソッドを使用して別のスレッドをスリープ状態にすることはできません - 他のスレッドはそれ自体でこれを行う必要があります (ただし、明らかにメッセージを送信することはできます)。
このメソッドは、現在/実行中のスレッドに対して常に呼び出されます。
これは、現在のスレッドが特定の時間スリープ モードになることを意味します。例: Thread.sleep(1000) と書くと、スレッドは 1000 ミリ秒間スリープ状態になります。このメソッドは、主にスレッド間の交換に使用します。つまり、別のスレッドに実行の機会を与えます。
現在のスレッドは、実際にコードを実行するスレッドです。それと同じくらい簡単です。
例えば:
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Before sleeping!");
Thread.sleep(10000);
System.out.println("After sleeping!");
}
}
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
System.out.println("Main thread!");
}
次のような出力が得られる場合があります。
Before sleeping! // t1
Main thread! // main
Before sleeping! // t2
After sleeping! // t1
After sleeping! // t2