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了一下,释放锁。已备下次调用。
新闻热点
疑难解答