1. 程式人生 > >建立執行緒的幾種方式,以及為什麼啟動執行緒不用run,而用start方法!!!

建立執行緒的幾種方式,以及為什麼啟動執行緒不用run,而用start方法!!!

首先,我們大家都知道,建立執行緒的兩種蛀主要的方法,一種是繼承Thread類,另一種是實現Runnable介面。對於第一種建立執行緒的方式有兩個不足:
1.當前執行緒重寫run方法定義該執行緒要完成的工作,這就導致了任務是定義線上程內部的,於是執行緒與任務有一個強耦合關係,不利於執行緒的重用。
2.由於java是單繼承的,這就導致了若繼承了執行緒就無法繼承其他類,在實際開發中經常會出現繼承衝突的問題(單繼承極限)。
</pre><pre name="code" class="java">
package sync;
/**
 * 執行緒的建立方式有兩種:
 * 方式一:繼承Thread類並重寫run方法
 * @author Administrator
 *
 */
public class ThreadDemo1 {
	public static void main(String[] args) {
		/*
		 * 有先後順序的執行稱為同步的執行
		 */
//		for(int i =0;i<500;i++){
//			System.out.println("你是誰啊?");
//			System.out.println("我是查水錶的");
//		}
		/*
		 * 程式碼各幹各的,則是非同步執行.
		 */
		Thread t1 = new MyThread1();
//		t1.run();
		Thread t2 = new MyThread2();
		/*
		 * 啟動執行緒不要直接呼叫run方法,而是
		 * 應該呼叫start方法,這樣執行緒才會併發執行,
		 * run方法會線上程啟動後自動被呼叫.
		 */
		t1.start();
		t2.start();
		
	}
}


class MyThread1 extends Thread{
	public void run() {
		for(int i =0;i<5000;i++){
			System.out.println("你是誰呀?");
		}
	}
}
class MyThread2 extends Thread{
	public void run() {
		for(int i =0;i<5000;i++){
			System.out.println("我是查水錶的。");
		}
	}
}

Thread.java 類中的start() 方法通知“執行緒規劃器”此執行緒已經準備 就緒,等待呼叫執行緒物件的run() 方法。這個過程其實就是讓系統安排 一個時間來呼叫Thread 中的run() 方法,也就是使執行緒得到執行,啟動 執行緒,具有非同步執行的效果。如果呼叫程式碼thread.run() 就不是非同步執行 了,而是同步,那麼此執行緒物件並不交給“執行緒規劃器”來進行處理, 而是由main 主執行緒來呼叫run() 方法,也就是必須等run() 方法中的代 碼執行完後才可以執行後面的程式碼。 

package sync;
/**
 * 第二種建立執行緒的方式:
 * 實現Runnable介面來單獨定義執行緒任務.
 * @author Administrator
 *
 */
public class ThreadDemo2 {
	public static void main(String[] args) {
		Runnable runnable1 = new MyRunnable1();
		Runnable runnable2 = new MyRnunable2();
		
		Thread thread1 = new Thread(runnable1);
		Thread thread2 = new Thread(runnable2);
		
		thread1.start();
		thread2.start();
	}
}
class MyRunnable1 implements Runnable{
	public void run(){
		for(int i =0;i<500;i++){
			System.out.println("你是誰呀?");
		}
	}
}
class MyRnunable2 implements Runnable{
	public void run(){
		for(int i =0;i<500;i++){
			System.out.println("我是查水錶的.");
		}
	}
}

package sync;
/**
 * 以匿名內部類完成方式一與方式二的建立.
 * @author Administrator
 *
 */
public class ThreadDemo3 {
	public static void main(String[] args) {
		Thread t1 = new Thread(){
			public void run(){
				for(int i=0;i<500;i++){
					System.out.println("你是誰?");
				}
			}
		};t1.start();
		Runnable run = new Runnable(){
			public void run(){
				for(int i=0;i<500;i++){
					System.out.println("我是查水錶的.");
				}
			}
		};Thread t2 = new Thread(run);t2.start();
	}
}


參考資料:Java多執行緒程式設計核心技術。