建立執行緒的幾種方式,以及為什麼啟動執行緒不用run,而用start方法!!!
阿新 • • 發佈:2019-01-24
首先,我們大家都知道,建立執行緒的兩種蛀主要的方法,一種是繼承Thread類,另一種是實現Runnable介面。對於第一種建立執行緒的方式有兩個不足:
1.當前執行緒重寫run方法定義該執行緒要完成的工作,這就導致了任務是定義線上程內部的,於是執行緒與任務有一個強耦合關係,不利於執行緒的重用。
2.由於java是單繼承的,這就導致了若繼承了執行緒就無法繼承其他類,在實際開發中經常會出現繼承衝突的問題(單繼承極限)。
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多執行緒程式設計核心技術。