分析一段代码理解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了一下,释放锁。已备下次调用。


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangyj1992/article/details/54849841

多线程中让main方法最先开始,最后结束的简单例子

package com.eduask.luck; public class ThreadTestOne { /** * @param args * @throws In...
  • one_isi_all
  • one_isi_all
  • 2015-09-10 17:55:05
  • 1444

Java运行的基本线程解析

今天根据网上找的一些资料,配合自己的理解,将java程序启动时的一些命令如jps, jstack, 总结如下:(主要是留给自己看的) 线程名称 解释说明 Attach...
  • clamaa
  • clamaa
  • 2017-04-11 09:47:45
  • 332

Java线程详解,写的很好

Java线程:概念与原理 一、操作系统中线程和进程的概念 现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。 进程是指一个内存中运行的应用程序,每个进程都有自己独...
  • ygd266
  • ygd266
  • 2015-02-05 17:07:38
  • 9385

SFMTest.cpp

  • 2015年04月28日 21:40
  • 2KB
  • 下载

典型相关分析如何分析两组变量的关系

前言我们在分析两组变量之间的相关性时,比如X=[X1,X2,...,Xm]X=[X_1,X_2,...,X_m]和Y=[Y1,Y2,...,Yn]Y=[Y_1,Y_2,...,Y_n],最原始的方法就...
  • wangyangzhizhou
  • wangyangzhizhou
  • 2017-12-07 09:15:44
  • 1428

main是一个线程

package cm.com.show; //main是一个线程 public class MainThread { public static void main(String[] a...
  • pangqiandou
  • pangqiandou
  • 2016-09-09 16:20:33
  • 180

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

main函数和子线程之间的关系,一直搞不太明白,到底谁先执行: (程序是引用别人的一段程序) 实现的功能: 编写程序实现,子线程循环10次,接着主线程循环20次,接着再子线程循环...
  • wangyj1992
  • wangyj1992
  • 2017-02-03 22:25:56
  • 285

java一段简单的代码看懂多线程结果

java一段简单的代码看懂多线程结果
  • liangrui1988
  • liangrui1988
  • 2016-09-09 20:54:46
  • 394

汇编学习第四课之main函数反汇编

从零学汇编之分析main函数
  • haolipengzhanshen
  • haolipengzhanshen
  • 2016-05-11 14:13:49
  • 871

Java线程详解(深度好文)

本文对线程相关知识做了详细介绍和讲解,包括概念与原理、创建与启动、线程栈模型与线程的变量、状态转换、同步与锁、交互、调度(休眠、优先级、让步、合并、守护线程)、并发协作以及线程新特征等等。...
  • cuigx1991
  • cuigx1991
  • 2015-09-05 03:18:12
  • 7460
收藏助手
不良信息举报
您举报文章:分析一段代码理解main函数与子线程间的关系
举报原因:
原因补充:

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