Q:

Learning threads in Java, finding difficulty in Understanding some aspects

I am learning Threads in Java online and I am a beginner, I am facing difficulty in understanding some concept. Can anyone help me? 
Link I am learning from:http://www.codeproject.com/Articles/616109/Java-Thread-Tutorial
Problem:
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");
    }
}

EDIT: Code of FirstIteration and 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");
        }
    }
}

A:

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

Reference Assignment.
You are creating a copy of reference si in r1. So, after that statement, both r1 and si will refer to the same object.
            ______________________
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 ----------

Actually, they could have simply done:
r1 = new SecondIteration();

instead of those two steps. But, as setArg() method is not declared in Runnable interface. So, to call it, you would have to do typecasting as below:
((SecondIteration)r1).setArg();

That might not be much readable, that is why they have probably divided that into two steps: 
SecondIteration si = new SecondIteration();
si.setArg("Pedram"); 
r1=si;

