java多執行緒程式設計入門
阿新 • • 發佈:2018-12-31
package com.CUPK.lsz; public class TraditionalThread { public static void main(String[] args) { /* * 方法一: */ // 定義一個子類物件 Thread thread0 = new Thread() { public void run() { while (true) { try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("0當前執行緒為:" + Thread.currentThread().getName()); System.out.println("1當前執行緒為:" + this.getName()); } } }; // thread0.start(); /* 方法二 */ Thread thread1 = new Thread(new Runnable() { @Override public void run() { while (true) { // TODO Auto-generated method stub System.out.println("當前執行緒為:" + Thread.currentThread().getName()); } } }); // thread1.start(); /* 深入理解run()方法 */ //首先start()方法去找當前物件Thread,並執行當前物件的run()方法,如果沒找到子類的run()方法,才會去找父類的run()方法,在Runnable物件不為null時,父類run()方法會去找Runnable的run()方法,而當前子類有run()方法,所以會執行子類的run()方法 //建立Thread類的子物件,並重run()方法,這個時候子類的run()方法已經重寫了父類的run()方法 new Thread(new Runnable() { @Override public void run() { System.out.println("Runnable run" + Thread.currentThread().getName()); } }) { @Override public void run() { while (true) { System.out.println("Thread run" + Thread.currentThread().getName()); } } }.start(); } } //如果我們將Thread類的子物件中的run()方法去掉,則會呼叫父類run()方法,有因為Runnable物件不為null,所以進而呼叫Runnable的run()方法
這裡我們重點說一下方法二 :
首先我們看一下Thread類的原始碼:
由上面圖片可以看出1、在Thread類中定義了Runnable類的target物件
2、在Thread的構造方法public Thread(Runnable target)中呼叫了init()方法
3.private void init(ThreadGroup g, Runnable target, String name,
long stackSize, AccessControlContext acc) 方法中
this.target=target語句將類中的target物件賦值
4.類中的run(){}方法有如下語句:if(targit!=null){target.run();}說明如果類中的target物件不為null,則呼叫target物件的run()方法,
所以我們將Runnable類建立的target子物件傳給Thread()類,並在其中實現target子物件的run()方法。