剛看到的一個前輩分析的,感覺醍醐灌頂,在這記錄學習一下。
關於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();