標籤:java多線程 繼承 public cep interrupt 傳遞 情況 base 父類
1.線程的建立
之前知道Java中一個多線程的建立方法是繼承Thread類或者實現Runable介面,但是看不懂下面這種建立線程的方法
第一種
[java] view plain copy print?
- new Thread(new Runnable() {
- @Override
- public void run() {
-
- }
- }
- }).start();//這種方式中new Thread()是建立了一個線程,而new Runable()對象中是線程想要執行的代碼,這樣把想要執行的代碼放到一個建立的對象中,所
[java] view plain copy print?
- <span style="white-space:pre"> </span> //以很好的體現了物件導向的編程規則。
或者下面這種建立格式
第二種
[java] view plain copy print?
- new Thread(){
- @Override
- public void run() {
- // TODO Auto-generated method stub
- super.run();
- }
- }.start();
其實兩種方法昨天看了一段是視頻現在理解了,其實第一種方法就是物件導向的思維模式去建立一個線程,在Thread的源碼中,一種是通過構造方法傳遞一個Runable對象然後為target賦值,然後去實現一個線程的建立,也就是上面的第一種建立方法,一種是直接重寫run方法,也就是上面的第二種方法建立線程,但是網上通常是使用第一種方法的比較多?那是為什麼呢?是因為第一種通過構造方法的方式建立線程更能體現面向的規則,new Thread()是建立了一個對象,這個對象想要執行的代碼就寫在了括弧裡面,這樣就很好的體現了物件導向的編程方式。
那我們想一下,下面這種建立對象的方式是會執行Runable中的run方法還是執行thread的run方法呢?
[java] view plain copy print?
- 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方法。
更好的理解java多線程