看到的一個前輩說道的Runnable和Thread的區別,感覺很贊!

剛看到的一個前輩分析的,感覺醍醐灌頂,在這記錄學習一下。

關於Thread和Runnable的區別

Thread和Runnable是實現java多線程的兩種方式,Thread是類,Runnable爲接口,建議使用Runnable來實現多線程。
如果讓一個線程實現Runnable接口,那麼當調用這個線程的對象開啓多個線程時,可以讓這些線程調用同一個變量;
若這個線程是由繼承Thread類而來,則要通過內部類來實現上述的功能,利用的就是內部類可任意訪問外部類變量這個特性。(精闢!!)

Runnable使用例子

public class ThreadTest
{
public static void main(String[] args)
{
   MyThread mt=new MyThread();
   new Thread(mt).start();     //通過實現Runnable的類的對象來開闢第一個線程
   new Thread(mt).start();     //通過實現Runnable的類的對象來開闢第二個線程
   new Thread(mt).start();     //通過實現Runnable的類的對象來開闢第三個線程
   //由於這三個線程是通過同一個對象mt開闢的,所以run()裏方法訪問的是同一個index
}
}

class MyThread implements Runnable    //實現Runnable接口
{
int index=0;
public void run()
{
   for(;index<=200;)
    System.out.println(Thread.currentThread().getName()+":"+index++);
}
}


Thread使用例子:

public class ThreadTest
{
public static void main(String[] args)
{
   MyThread mt=new MyThread();
   mt.getThread().start();       //通過返回內部類的對象來開闢第一個線程
   mt.getThread().start();      //通過返回內部類的對象來開闢第二個線程
   mt.getThread().start();      //通過返回內部類的對象來開闢第三個線程
   //由於這三個線程是通過同一個匿名對象來開闢的,所以run()裏方法訪問的是同一個index
}
}


</pre><pre name="code" class="java">class MyThread
{
int index=0;
private class InnerClass extends Thread    //定義一個內部類,繼承Thread
{
   public void run()
   {
    for(;index<=200;)
     System.out.println(getName()+":"+index++);
   }
}
Thread getThread()     //這個函數的作用是返回InnerClass的一個匿名對象
{
   return new InnerClass();
}
}
// 這裏有一個問題:如果內部類要訪問一個外部變量或方法,那麼這個變量或方法必須定義爲final,但爲什麼這裏的變量index不用定義爲final就可以被內部類訪問?

Thread sender = new Thread(){
    @Override
    public void run() {
    ....
    }
}
sender.start();



發佈了17 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章