2012-05-01 6 views
2

は、私はスレッドでいくつかのJavaコーディングを開始すると、私は理解していないOracleのチュートリアルセクションでのコードの行に出くわしたとそれが動作する理由私は私のために明確にすることができ、ここで誰かを望んでいるよ。この中Javaスレッドのトレールで "new"の前後にかっこがありますか?

(new Thread(new HelloRunnable())).start(); 

新しいスレッドは宣言されますが、オブジェクトに直接適用されることはありません。その後、すぐにstartメソッドを呼び出してスレッドを実行します。これはどのように作動しますか?なぜ新しい キーワードがこの小文字の中で機能しますか?ここで何が起こっているのか、いくつか明確にしたいと思います。ありがとうございます。完全なソースは次のとおりです。 http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html

+0

ありがとう、私が知りたいと思う1つの具体的な事柄は、新しい括弧の前に何の構文目的があるのでしょうか?インタプリタに新しいオブジェクトを変数に適用しないことを指示するのは、それですか? – TheEllo

+1

括弧は目的を果たさない。それらを削除して再コンパイルすると、まったく同じコードが生成されます。 – erickson

+0

はい。彼らは読書の容易さのためだけです。 – Victor

答えて

0

これは有効なステートメントです。 Threadオブジェクトに対してstart()メソッドを実行します。 Threadオブジェクトは、参照変数として宣言されただけでなく、オブジェクトとして作成されます。

0

スレッドコンストラクタに渡すためにRunnableを実装するオブジェクトのインスタンスが必要です。電話new HelloRunnable()はそれをあなたに与えます。

実行するにはThreadオブジェクトが必要です。 new Thread()への呼び出しはそれをあなたに与えます。

この新しいThreadインスタンスでは、start()を呼び出します。コンストラクタに渡したRunnableインスタンスのメソッドrun()を呼び出します。

0
  1. 新しいThreadオブジェクトが作成され、startが呼び出されます。
  2. なぜでしょうか?オブジェクトの作成は、変数に格納することとは別の操作です。 HelloRunnableの作成方法を見てください。同じことをやっています。
1

この行は同等です:

// I have put it in block, as you don't have a reference to any of those objects afterwards 
{ 
    // instantiate a runnable 
    HelloRunnable runnable = new HelloRunnable(); 
    // instantiate a thread object that will use this runnable 
    Thread thread = new Thread(runnable); 
    // start the thread (call the run method of the runnable on a new thread) 
    thread.start(); 
} 
2

スレッド・インスタンスの周りの括弧は必要ありません。あなたが文を展開すると次のことが全く同じように

new Thread(new HelloRunnable()).start(); 

動作しますが、それはチュートリアルでは、簡潔され、このコード

Runnable myrunnable = new HelloRunnable(); 
Thread mythread = new Thread(myrunnable); 
mythread.start(); 

に相当します。

関連する問題