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

原创 2017年02月03日 22:25:56

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

如何理解在程序中调用另一个类的MAIN()方法

转自:http://blog.163.com/liu_sheng_han/blog/static/190591372201210170548675/ main方法,被JAVA虚拟机调用就是入...
  • Manketon
  • Manketon
  • 2015年02月09日 19:17
  • 1434

将一个函数在主线程执行及子线程执行的方法

//开辟主线程 1.GCD方法,通过向主线程队列发送一个block块,使block里的方法可以在主线程中执行 dispatch_async(dispatch_get_m...
  • qq_30997845
  • qq_30997845
  • 2015年11月28日 20:48
  • 1337

将一个函数在主线程执行及子线程执行的方法

//开辟主线程 1.GCD方法,通过向主线程队列发送一个block块,使block里的方法可以在主线程中执行 dispatch_async(dispatch_get_m...
  • qq_30997845
  • qq_30997845
  • 2015年11月28日 20:48
  • 1337

讨论main函数执行结束后还能在执行一段代码吗?

今晚突然脑中出现了这个问题,于是通过查找一些资料来进行一下解答。 要实现这个功能就需要使用atexit()函数,乍一看似乎是和exit()函数有关系,所以我们就先来复习一下exit()函数。 ex...
  • u011192270
  • u011192270
  • 2015年04月07日 22:14
  • 1820

Java中的main线程是不是最后一个退出的线程

Java中的main线程是不是最后一个退出的线程 个人blog原文地址:http://www.gemoji.me/when_main_thread_end/  之所以写这篇文章,是因为...
  • anhuidelinger
  • anhuidelinger
  • 2013年08月27日 19:31
  • 10573

C++ 之 main函数的调用与被调用

main函数能调用自身吗? 其他函数能调用main函数么? 下面先看一段有意思的程序,一个简洁有趣的打印菱形的程序。 [cpp] view plaincopy ...
  • u013630349
  • u013630349
  • 2015年09月03日 22:08
  • 1517

通过JAVA的main方法直接访问spring mvc 的controller

import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.htt...
  • lhwww
  • lhwww
  • 2016年09月29日 09:51
  • 4318

两个线程同时调用同一个处理函数的互斥问题

问题背景:在工作中遇到过一个问题,就是在两个线程同时调用同一个函数的时候,到底是应该在这个函数的内部什么处理上加上互斥。原因又是什么? 为了调查这个问题,我决定从以下三方面调查 1.线程中函数的调...
  • mq_ydn3102
  • mq_ydn3102
  • 2013年01月30日 21:35
  • 7194

Linux系统中,main函数的执行过程

1. 问题:linux如何执行main函数。 本文使用一个简单的C程序(simple.c)作为例子讲解。代码如下, int main() { return(0); } 2....
  • sxh741
  • sxh741
  • 2017年02月10日 14:22
  • 822

两个线程同时调用一个函数会出现什么情况?

两个线程同时调用一个函数会出现什么情况? 最近在研究多线程,然后突然想到如果两个线程同时访问一个函数的话,要不要加锁呢,加锁怎么加,不加又怎样这样的问题..然后去网上找了些帖子学习学...
  • a2274335673
  • a2274335673
  • 2016年08月31日 11:20
  • 8815
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分析一段代码理解main函数与子线程间的关系
举报原因:
原因补充:

(最多只允许输入30个字)