1. 程式人生 > >start()和run()的區別

start()和run()的區別

本方法通過實現runnable介面來實現多執行緒,剛開始被run()和start()搞糊塗了,後來看了很多部落格,稍有感悟。所以寫一下自己的理解。start()方法讓一個執行緒進入就緒佇列等待分配cpu,分到cpu後才呼叫實現的run()方法。

若不使用start()直接在main方法中直接使用run()方法, 比如下面程式的前兩種情況,因為沒有開闢新的執行緒,所以當前執行緒是main執行緒,而第三種情況,開闢了一個新執行緒且執行緒名我們設定為了“新執行緒”,在cpu執行新執行緒時會呼叫run()方法。

package javaNewThread;
public class test1main {
	public static void main(String[] args) {
		runnable runner=new runnable();
		Thread th1= new Thread(runner,"新執行緒");
		
//區分以下三種情況
        
        //1
		System.out.println("th1.run():");
		th1.run();
		//2
		System.out.println("runner.run():");
		runner.run();
		//3
		System.out.println("th1.start():");
		th1.start();
	}
}
public class runnable implements Runnable{
	private int food=10;
	public void run() {
		for(int i=0;i<3;i++) {
			System.out.println("執行緒名:"+Thread.currentThread().getName()+" food:"+food--);
		}
	}
}

結果:

th1.run():
執行緒名:main food:10
執行緒名:main food:9
執行緒名:main food:8
runner.run():
執行緒名:main food:7
執行緒名:main food:6
執行緒名:main food:5
th1.start():
執行緒名:新執行緒 food:4
執行緒名:新執行緒 food:3
執行緒名:新執行緒 food:2

------------交換123的順序,檢視執行結果

接下來我把3放到1和2前面執行,發現新執行緒的run()還是最後執行,說明它在就緒佇列中排隊,並沒有這麼快執行。而當前正在執行mian執行緒,每個執行緒執行都有一個時間片,main執行緒時間片還沒結束,所以23先執行了。等main執行緒時間片用完,再執行新執行緒。

package javaNewThread;
public class test1main {
	public static void main(String[] args) {
		runnable runner=new runnable();
		Thread th1= new Thread(runner,"新執行緒");
		
        //1,原來的3
		System.out.println("th1.start():");
		th1.start();
	    //2
		System.out.println("th1.run():");
		th1.run();
		//3
		System.out.println("runner.run():");
		runner.run();
	}
}
package javaNewThread;

public class runnable implements Runnable{
	private int food=10;
	public void run() {
		for(int i=0;i<3;i++) {
			System.out.println("執行緒名:"+Thread.currentThread().getName()+" food:"+food--);
		}
	}
}

執行結果:

th1.start():
th1.run():
執行緒名:main food:10
執行緒名:main food:9
執行緒名:main food:8
runner.run():
執行緒名:main food:7
執行緒名:main food:6
執行緒名:main food:5
執行緒名:新執行緒 food:4
執行緒名:新執行緒 food:3
執行緒名:新執行緒 food:2