1. 程式人生 > >java多執行緒程式設計入門

java多執行緒程式設計入門


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()方法。