1. 程式人生 > >Java之多執行緒易範錯誤

Java之多執行緒易範錯誤

public class mainTestImpl { 

	/*
	 * 任何執行緒一般具有五種狀態,即建立、就緒、執行、阻塞、終止 執行緒 呼叫stop()方法時或run()方法執行
	 * 結束後,執行緒即處於死亡狀態。 處於死亡狀態的執行緒不具有繼續執行的能力。
	 */

	public static void main(String[] args) {
		 testThread t = new testThread();
		 t.run(); // start是啟動一個執行緒由程式來呼叫run方法
		// run 是執行一個方法,等結束以後再執行後面的程式碼,不能達到多執行緒目的
         System.out.println(Thread.currentThread().getName() + " 執行緒執行結束!");

	}
}


// 通過類繼承必須有run方法,因為start啟動執行緒後由程式呼叫run方法
// Thread同樣實現了Runnable介面
class testThread extends Thread {
	public void run() {
		for (int i = 0; i < 5; i++) {
			try {
				Thread.currentThread().sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("runnable=" + Thread.currentThread().getName() + " " + i);
		}
		//new threadImp().run();
	}
}
執行後的結果如下:
runnable=main 0
runnable=main 1
runnable=main 2
runnable=main 3
runnable=main 4
main 執行緒執行結束!
可以看到都是main執行緒在執行,並不是期望的多執行緒。原因就在於呼叫了run()方法,將如上對應程式碼段改為如下後執行:
t.start(); // start是啟動一個執行緒由程式來呼叫run方法
// run 是執行一個方法,等結束以後再執行後面的程式碼,不能達到多執行緒目的
main 執行緒執行結束!
runnable=Thread-0 0
runnable=Thread-0 1
runnable=Thread-0 2
runnable=Thread-0 3
runnable=Thread-0 4

修改testThread執行緒類並且增加一個實現Runnable介面的執行緒類,程式碼如下:
// 通過類繼承必須有run方法,因為start啟動執行緒後由程式呼叫run方法
// Thread同樣實現了Runnable介面
class testThread extends Thread {
	public void run() {
		new threadImp().run(); // 啟動執行緒
	}
}

class threadImp implements Runnable {
	// 執行緒的幾個狀態,判斷屬性,計數次數,同步方法
	public void run() {
			for (int i = 0; i < 50; i++) {
				System.out.println("runnable=" + Thread.currentThread().getName() + " " + i);
			}
	}
}
通過mainTestImpl類中的testThread類的run方法來啟動另外一個執行緒,發現執行的結果還是單執行緒,不知道為什麼。。。。。。。