一、Thread創建線程,通過新建類繼承Thread類,重寫run方法,然後在main方法中start(),創建並啓動線程.
public class MyThread extends Thread{//除了構造方法和私有屬性其他的都可以被繼承下來
@Override//重寫了父類Thread的run方法.
//在main方法start()創建並啓動線程時,會調用此方法.
public void run(){
System.out.println("子線程的信息:"+Thread.currentThread().toString());
}
public MyThread(String name){
super(name);
}
}
public class Test{
public statci void main(String[] args){
MyThread mt = new MyThread("子線程");
mt.start();//創建並啓動線程,並調用MyThread中重寫過後的run方法
}
}
二、通過實現Runnable接口來創建線程
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
public class ThreadTest{
public static void main(String[] args){
MyRunnable mr = new MyRunnable();
Thread t = new Thread(mr,"測試線程");
t.start();
}
}
通過Thread.currentThread().getName()可以查詢線程的名稱.
三、匿名內部類創建線程
public class AnonymousInnerClassThread {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Thread: "+i);
}
}
};
new Thread(r).start();
for (int i = 0; i < 20; i++) {
System.out.println("Thread II: "+i);
}
}
}
通過創建一個匿名內部類來啓動線程。匿名內部類,匿的是類的名字。通過一個匿名的類來implements接口重寫其中的run方法。Thread中的構造方法有一個Thread(Runnable target).此時的r就相當於一個匿名類實現的target對象.
Thread和Runnable的區別
A:避免了Java單繼承的侷限性;
說明:如果使用方式一,那麼在Java中一個類只能有一個直接父類,如果一個類已經繼承其他的父類,那麼當前這
個類中假如有需要多線程操作的代碼,這時這個類是無法再繼承Thread類的。這樣就會導致當前這個類中的某些
需要多線程執行的任務代碼就無法被線程去執行。
B:把線程代碼和任務的代碼分離,解耦合(解除線程代碼和任務的代碼模塊之間的依賴關係)。代碼的擴展性非常
好;
說明:Thread類是專門負責描述線程本身的。Thread類可以對線程進行各種各樣的操作。如果使用第一種方式,
那麼把線程要執行的任務也交給了Thread類。這樣就會導致操作線程本身的功能和線程要執行的任務功能嚴重的
耦合在一起。
但是方式二,自定義一個類來實現Runnable接口,這樣就把任務抽取到Runnable接口中,在這個接口中定義線程
需要執行的任務的規則。當需要明確線程的任務時,我們就讓這個類實現Runnable接口,只要實現Runnable接口
的類,就相當於明確了線程需要執行的任務。
當一個類實現Runnable接口,就相當於有了線程的任務,可是還沒有線程本身這個對象。這時我們就可以直接使
用Thread這個類創建出線程,然後把任務交給線程。這樣就達到任務和線程的分離以及結合。