2017-04-20 9 views
0
t=new Thread(this,"clocky"); 
t.start(); 

これは新しいスレッドを作成する方法ですが、なぜこれを使用するのかわかりません。「this」はJavaのマルチスレッド化ではどういう意味ですか?

+5

修正:これは**新しいスレッドを作成する**方法です。詳細は、[スレッドの定義と起動](https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html)を参照してください。 – shmosel

答えて

1

現在のオブジェクトrun()メソッド(Runnableインターフェイス)をこのスレッドのメイン/開始方法として使用していることを意味します。

4

Java docを見てみましょう。そのrunメソッドこのスレッドが 開始されたときに呼び出されるオブジェクト - あなたが実際に

public Thread(Runnable target, String name)

java docこのコンストラクタを呼び出している

ターゲット氏は述べています。 nullの場合、このスレッドのrunメソッドが呼び出されます。

- それはJavaで他の場所にあるように、新しいスレッド

の名前ここでthisは、あなたがそれを呼び出しているクラスの現在のオブジェクトを参照します。あなたのクラスがRunnableを実装し、run()メソッドをオーバーライドしていると確信しています。コンストラクタパラメータがどのようにマッチするか

+1

最後の単語にマイナータイプミス:*が一致します。 –

+0

ow。はい。ありがとう。修正されました。 –

+0

ところで、非常に良い答え、upvoted! ;-) –

0

を見てみましょう

Multithread Basics

簡単な例

public class Test { 

public static void main(String[] args) throws ParseException { 


    Thread threadOne = new Thread(new Class_1(),"Class_1"); 
    Thread threadTwo = new Thread(new Class_2(), "Class_2"); 


    threadOne.run(); //This run calls run in Class_1 
    threadTwo.run(); //This run calls run in Class_2 


} 

} 

class Class_1 implements Runnable{ 
@Override 
public void run() { 
    System.out.println("Class_1 run method"); 
} 
} 

class Class_2 implements Runnable{ 
@Override 
public void run() { 
    System.out.println("Class_2 run method"); 
} 
} 

出力

Class_1 run method 
Class_2 run method 
0

Runnableインターフェイスを現在のクラスに実装し、キーワードを使用して現在の実行可能オブジェクトをクラスのコンストラクタ内に渡してスレッドを初期化する必要があります。

以下のサンプルのように実行可能クラスのインスタンスを作成する際には実行メソッドを呼び出す必要があります。

public class Nool implements Runnable { 

    Thread t; 

    public Nool() { 
     t = new Thread(this, "Nool"); 
     t.start(); 
    } 

    @Override 
    public void run() { 
     System.out.println("NOOL"); 
    } 

} 

私は説明があなたを助けてくれることを願っています。

+0

オブジェクトのコンストラクタが返される前に、あるオブジェクトへの参照をスレッドに与えることは、まったく悪い考えです。 (オブジェクトが[_safely published_](https://www.ibm.com/developerworks/library/j-jtp0618/)になる前に) –

+0

@jameslarge説明しようとしていることを理解できません。 – vijayraj34

+0

'Nool'クラスのコンストラクタは' this'を新しいスレッドに渡します。 'this'は、コンストラクタがまだ構築を完了していないオブジェクトへの参照です。新しいスレッドが開始されたときにスレッド間で同期がとれていないので、これは悪いことです。同期がないと、あるスレッドが別のスレッドによって加えられた変更をいつ(いつまでも)確認することはできません。 'thread.start()'はあなたのコンストラクタが行う最後のものですが、新しいスレッドはオブジェクトを非構造状態で見ることができます。 –

関連する問題