0

私は Java のスレッドをオンラインで学習していますが、私は初心者であり、いくつかの概念を理解するのに苦労しています。誰でも私を助けることができますか?

私が学んでいるリンク: http://www.codeproject.com/Articles/616109/Java-Thread-Tutorial

問題:

public class Core {
    public static void main(String[] args) {
        Runnable r0,r1;//pointers to a thread method
        r0=new FirstIteration("Danial"); //init Runnable, and pass arg to thread 1
        SecondIteration si=new SecondIteration();
        si.setArg("Pedram");// pass arg to thread 2

        r1=si; //<~~~ What is Happening here??

        Thread t0,t1;
        t0=new Thread(r0);
        t1=new Thread(r1);
        t0.start();
        t1.start();
        System.out.print("Threads started with args, nothing more!\n");
    }
}

編集: FirstIteration と SceondIteration のコード

class FirstIteration implements Runnable{
    public FirstIteration(String arg){
        //input arg for this class, but in fact input arg for this thread.
        this.arg=arg;
    }

    private String arg;

    @Override
    public void run() {
        for(int i=0;i<20;i++){
        System.out.print("Hello from 1st. thread, my name is "+
            arg+"\n");//using the passed(arg) value
        }
    }
}

class SecondIteration implements Runnable{
    public void setArg(String arg){//pass arg either by constructors or methods.
        this.arg=arg;
    }

    String arg;

    @Override
    public void run() {
        for(int i=0;i<20;i++){
            System.out.print("2)my arg is="+arg+", "+i+"\n");
        }
    }
}
4

3 に答える 3

7

r1=si; <~~~ ここで何が起こっているの?? *

参照割り当て。

siで参照のコピーを作成していますr1。したがって、そのステートメントの後、 と の両方r1si同じオブジェクトを参照します。

            ______________________
si ------> |new SecondIteration();|   // You have 1 reference to this object
           ------------------------ 

r1 = si;  // Make Runnable reference `r1` point the same object that `si` refers

            ______________________
si ------> |new SecondIteration();|   // Now you have 2 reference to this object
           ------------------------
            ^
            |
r1 ----------

実際には、次のように簡単に実行できます。

r1 = new SecondIteration();

これらの2つのステップの代わりに。ただし、インターフェイスsetArg()でメソッドが宣言されていないため。Runnableしたがって、それを呼び出すには、次のように型キャストを行う必要があります。

((SecondIteration)r1).setArg();

それはあまり読みにくいかもしれません。そのため、彼らはおそらくそれを2つのステップに分けました:

SecondIteration si = new SecondIteration();
si.setArg("Pedram"); 
r1=si;
于 2013-07-24T09:52:58.577 に答える
0
r1=si; // <~~~ What is Happening here??***

本当に何もありません。

ローカル変数 s1 に格納されているオブジェクトを別のローカル変数 r1 に代入しているだけです。

おそらく「インターフェイスへのコード」を除いて、理由はわかりません(r1はRunnableであり、より具体的なSecondIterationではなくなりました)。

私がそれをしたいのであれば (それがどの Runnable 実装であるかの詳細を非表示にします)、さらに一歩進んでローカル スコープを使用するので、si は完全になくなります:

           Runnable r0=new FirstIteration("Danial");
           Thread t0=new Thread(r0); 

           Thread t1;
           {
              SecondIteration si=new SecondIteration();
              si.setArg("Pedram");// pass arg to thread 2
              t1 = new Thread(si);
           }


           t0.start();
           t1.start();
于 2013-07-24T09:54:09.933 に答える