1.線程的創建
之前知道Java中一個多線程的創建方法是繼承Thread類或者實現Runable接口,但是看不懂下面這種創建線程的方法
第一種
new Thread(new Runnable() {
@Override
public void run() {
}
}
}).start();//這種方式中new Thread()是創建了一個線程,而new Runable()對象中是線程想要執行的代碼,這樣把想要執行的代碼放到一個創建的對象中,所以很好的體現了面向對象的編程規則。
或者下面這種創建格式
第二種
new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
}
}.start();
其實兩種方法昨天看了一段是視頻現在理解了,其實第一種方法就是面向對象的思維模式去創建一個線程,在Thread的源碼中,一種是通過構造方法傳遞一個Runable對象然後為target賦值,然後去實現一個線程的創建,也就是上面的第一種創建方法,一種是直接重寫run方法,也就是上面的第二種方法創建線程,但是網上通常是使用第一種方法的比較多?那是為什麼呢?是因為第一種通過構造方法的方式創建線程更能體現面向的規則,new Thread()是創建了一個對象,這個對象想要執行的代碼就寫在了括號裡面,這樣就很好的體現了面向對象的編程方式。
那我們想一下,下面這種創建對象的方式是會執行Runable中的run方法還是執行thread的run方法呢?
new Thread(
new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("runable" + Thread.currentThread().getName());
}
}
}
) {
@Override
public void run() {
while (true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread" + Thread.currentThread().getName());
}
}
}.start();
new Thread(new Runable(){}){}.start();答案是執行thread中的run方法(即是子類中的run方法),為什麼呢?因為創建一個new thread的時候重寫了父類中的run()方法,那麼就會直接執行thread中的run方法了,如果這個子類中的run方法不存在的情況下才會去執行父類中的run方法。