分析一段代码理解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
- 分析一段代码理解main函数与子线程间的关系
- 深入分析Memcached的线程 main()函数
- 一段代码理解函数指针
- 主线程与子线程的关系
- main函数和thread线程类的初步理解
- 一段理解nio的代码
- APUE:线程:主线程与子线程的关系
- 线程中主线程与子线程之间的关系
- 一段代码分析 理解多线程交互
- main函数执行完毕,能否再执行一段代码
- 在main函数执行之前和之后执行一段代码
- stm32 官方例子main函数最后一段代码#ifdef USE_FULLASSERT
- 怎样在main()函数退出之后再执行一段代码?
- 一段重入锁的代码分析
- 一段汇编代码的分析
- SVNKIT一段代码的分析
- 线程安全与可重入函数的关系
- 分享一段JNI子线程中调用Java静态方法的代码
- 三层架构和MVC的区别
- 棋盘问题 dfs
- 【算法整理】听说你写的算法很牛?-优质算法衡量标准探讨
- Codeforces 763B-Timofey and rectangles
- 移除字符串NSString中的特定字符
- 分析一段代码理解main函数与子线程间的关系
- 二叉树的序列化(DFS)
- 蓝桥杯算法提高 身份证排序
- Bilibili直播的弹幕数据包解析
- 2017年--年度计划
- uboot起步
- 简单编程题目连载(十三)——拓扑结构相同子树判断
- ape entropy中rice编码用到的正数转负数问题
- eclipse在载入sdk时的一些问题的解决方案