分析一段代码理解main函数与子线程间的关系

来源:互联网 发布:js字符串split 编辑:程序博客网 时间:2024/06/06 01:33

main函数和子线程之间的关系,一直搞不太明白,到底谁先执行:

(程序是引用别人的一段程序)


实现的功能:

编写程序实现,子线程循环10次,接着主线程循环20次,接着再子线程循环10次,主线程循环20次,如此反复,循环5次.


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了一下,释放锁。已备下次调用。


1 0