main函數和子線程之間的關系,一直搞不太明白,到底誰先執行:
(程序是引用別人的一段程序)
實現的功能:
public class Demo01 { public static void main(String[] args) { final Function f=new Function(); new Thread( new Runnable(){ public void run() { for(int i=0;i<5;i++){ f.sub(); } } } ).start(); System.out.PRintln("---1----"); for(int i=0;i<5;i++){ f.main(); } } }//編寫功能類,實現子線程和主線程的功能class Function{ private boolean flag=false; //子線程要實現的功能 public synchronized void sub(){ System.out.println("---sub---"); while(flag){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for(int i=0;i<10;i++){ //for循環內定義子線程的功能,這里簡單的假設為打印一句話,主線程同理 System.out.println("sub"+i); } flag=true; this.notify(); } //主線程要實現的功能 public synchronized void main(){ System.out.println("---main---"); while(!flag){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for(int i=0;i<20;i++){ System.out.println("main"+i); } flag=false; this.notify(); } }wait是讓使用wait方法的對象等待,暫時先把對象鎖給讓出來,給其它持有該鎖的對象用,其它對象用完后再告知(notify)等待的那個對象可以繼續執行了,因此,只有在synchronized塊中才有意義(否則,如果大家并不遵循同步機制,那還等誰呢?根本沒人排隊,也就談不上等待和喚醒了)
這段程序從main函數進入,然后new Thread一個線程,這個線程的創建使用了內部類的創建模式,new Thread(new Runnable(){public void run(){}}).start();,子線程就緒;此時main函數也是一個線程,相當于主線程,然后這兩個線程同時競爭cpu的處理時間,所以會出現也能先執行了sub,也可能先執行了main。此時不管先執行那個,在Function類中,都先執行sub。因為如果先執行了main,則主線程wait,進入阻塞狀態,把鎖讓出來;如果先執行sub,sub執行了10次之后notify了一下,釋放鎖。已備下次調用。
新聞熱點
疑難解答