start()和run()的區別
阿新 • • 發佈:2018-11-09
本方法通過實現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