2012-05-31 14 views
8

私は作っているゲームのスレッドを使って作業しようとしています。私は非常にですので、正しく理解できない場合があります。私の質問は、Java APIのThreadクラスでcurrentThread()メソッドがどのように機能するかです。 APIは、 "現在実行中のスレッドオブジェクトへの参照を返します"と述べていますが、同時に複数のスレッドが実行されていると理解しています。実行中のスレッドを1つだけ返すことはどのように可能ですか?現在のスレッドメソッドjava

+0

スレッドに関するチュートリアルを読む必要があります。 – Sajmon

+2

私はそれらにgetSelfThread()などの名前を付けておかなければならないと思います。なぜなら、複数のCPUを持つ現在実行中のスレッドが複数ある可能性があるからです。 – goat

答えて

6

currentThreadを呼び出すコードは、いずれかのスレッドで実行されますが、すべてではなく、そのスレッドを具体的に取得できます。

+0

それははるかに明確になりますありがとうございました。 – user1427380

4

コード内の命令が実行されると、特定のスレッド内で実行されます。これは、そのメソッドによって返されたスレッドです。

明らかに、特定のメソッドが複数のスレッドによって実行された場合、実行ごとにThread.currentThread()の異なる値が返されることがあります。

この短い例を試して、何が起こっているか、特に2つのスレッドが並行して実行されているという事実をよりよく理解することができます。あなたは、いくつかのループを実行することt1はその後、t2がなどをT1に戻って同じことを行うとします表示されるはずです(あなたはあなたのマシンに応じて、高い数値に5からループの数を増やす必要があります):

public class TestThread { 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       for (int i = 0; i < 5; i++) { 
        System.out.println(Thread.currentThread()); 
       } 
      } 
     }; 

     Thread t1 = new Thread(r, "t1"); 
     Thread t2 = new Thread(r, "t2"); 
     t1.start(); 
     t2.start(); 
    } 
} 
+1

ループ内の現在のスレッドを印刷する必要があるのはなぜですか?一度十分であれば、私は思うだろう。 – Jeffrey

+0

私はあなたの最初の2つの文章が好きです...しかし、ポストの残りの部分、特にコードは、あいまいであるほど曖昧に見えます。 – goat

+0

@ジェフリー1つのスレッドがループを2回実行してからもう1つがアクティブになるようなインタリーブを表示するというアイデアでした。 – assylias

0

"現在実行中のスレッド"とは、システムスケジューラがコードを実行するためにこのスレッドに時間を与えたことを意味します。

-1

複数のスレッドが同時に実行されておらず、複数のスレッド間でスレッドの切り替えが行われています。プロセッサは一度に1つのタスクを実行できるので、一度に1つのスレッドが実行されます。そこで、現在実行中のスレッドの参照を取得します。

+0

マルチコアマシンは本当に一度に複数のスレッドを実行します。私は大規模なマルチスレッドのプログラム(高度にインタラクティブなスレッドを持つ)を単一のコアマシンで動かし、それを4コアのマシンに移動しました。それは本当の教育でした。 – RalphChapin

+0

"複数のスレッドが_同時に_同時に実行されていません..." – jdv

4

説明書のリストが紙に印刷されているとします。人が指示を読んで実行します。命令はプログラムです。その人はスレッドです。あなたは紙のコピーをたくさん作って、それを多くの人に渡すことができます。指示が「自分を叩く」のようなものであれば、自分では、その指導書を読んでいる人を指します。同様に、Thread.currentThread()は、その呼び出しをcurrentThread()に実行しているスレッドを指します。

0

シングルスレッドアプリケーションを書くときには、一連の命令のように、前の命令が完了した後に実行される命令を考えることができます(これはおおよその近似ですが、概念的にコンパイラとプロセッサは、これが本当に起こっていた場合)。

複数のスレッドを使用する場合、各スレッドにはそれぞれ独自の一連の命令があります。新しいスレッドが作成されると、エントリポイント(メソッド)が渡され、そこから実行を継続します。各スレッドは、メモリを共有しているため、あるスレッドからの副作用が別のスレッドに影響を与える可能性がありますが、実行中の他のスレッドとは独立しています(別のスレッドに対して1つの命令を実行するだけです)。

実行するコードによっては、あるスレッドのコンテキストで実行する必要があります(アプリケーションが起動するときにオペレーティングシステムによって作成され、実行はMainメソッドで開始されます)。関数currentThreadが呼び出されると、そのコンテキストの1つになります。

スレッドを作成するときのJavaランタイムは、そのThreadオブジェクトへの参照をスレッドコンテキストに格納し、currentThreadはそこを検索して現在のスレッドを返します。

0

任意の時点では、実行中のスレッドは1つだけです(ライブ)ので、Thread.currentThread()は現在実行中のスレッドの詳細を返します。例えば、Thread_name、priority、method_name。