关于主线程子线程运行顺序的疑惑

问题描述

关于主线程子线程运行顺序的疑惑
这里是书上截得一段程序,我不明白!


这是运行结果:

为什么运行结果一开始是waiting for thread to finish也就是主线程先跑的。
为什么一开始不是子线程先跑?
求大神解答

解决方案

因为pthread_join的存在,join使得主线程和子线程同步,主线程阻塞住等待子线程运行完。

不同语言略有差异,但是基本上都是类似的,找一篇文章你看下
http://blog.csdn.net/hmk2011/article/details/6289151

解决方案二:
线程创建后,多个线程谁在占有CPU是不确定的,所以可能先进主线程的wait,后进线程thread_funtion

解决方案三:
wait finish和running的顺序不确定,但是肯定是先执行完子线程才执行joined。

解决方案四:
单cpu上主线程先执行的概率大一些,因为和20ms的时间片相比,一条语句的执行几乎不花时间,很偶然地,执行完创建线程,时间片用完,先执行子线程。

时间: 2024-08-08 04:23:46

关于主线程子线程运行顺序的疑惑的相关文章

java编程中主线程子线程交替问题分析

问题:子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次. 分析:这个实际上是很简单的问题,即子线程run,主线程阻塞--->子线程阻塞,主线程run,能够使线程阻塞的方法有很多,最常见的是sleep与wait:当然,需要控制的话,用wait/notify.子线程与主线程共同操作一个Resource 对象,而Resource对象中由两个方法分别实现子线程与主线程的操作对象 代码如下: package treadga

Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作

前言:通常,我们写的公共的模块给别人用,但是这个模块又必须在特定的线程中执行.         比如,一个加载网络图片的的方法,需要在子线程中执行. /** * 加载网络图片 */ private void loadImage() { try { //用延时3秒操作来模拟网络操作 Thread.sleep( 3000 ); } catch (InterruptedException e) { e.printStackTrace(); } } 但是其他的同事在使用的时候,可能一不小心就在主线程中执

主线程等待子线程运行结束再完成的效果如何实现

问题描述 主线程抛出一个子线程异步处理一些东西,这时主线程要等待子线程运行完成再完成(其实我是为了统计运行时间的).这里抛出的子线程可能递归的调用自己,就是再抛一个他的子线程出来,但是到底一共抛多少,事先是不知道的.应用场景:1)多线程扫描文件夹内的文件,遇到文件夹内有子文件夹,要递归调用扫描线程的,等到全部扫描完成后,返回结果,显示:2)多线程快速排序,第一次肯定是单线程的,第一次排序完成后,会分两半,这两半多线程排,递归调用了这个排序线程,这两半很有可能,极大有可能再各分两半,也就是会有4个

Java多线程--让主线程等待所有子线程执行完毕在执行_java

朋友让我帮忙写个程序从文本文档中导入数据到oracle数据库中,技术上没有什么难度,文档的格式都是固定的只要对应数据库中的字段解析就行了,关键在于性能. 数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis()在最后一个子进程结束后记录当前时间,两次一减得到的时间差即为总共的用时,代码如下  long tStart = System.currentTim

Android Handler主线程和一般线程通信的应用分析_Android

Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作.如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会

Android实现在子线程中更新Activity中UI的方法_Android

本文实例讲述了Android实现在子线程中更新Activity中UI的方法.分享给大家供大家参考,具体如下: 在Android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示.但是,在主线线程之外的线程中直接更新页面显示的问题是:系统会报这个异常: ERROR/AndroidRuntime(1222): android.view.ViewRoot$CalledFromWrongThreadException: Only the original

Android实现在子线程中更新Activity中UI的方法

本文实例讲述了Android实现在子线程中更新Activity中UI的方法.分享给大家供大家参考,具体如下: 在Android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示.但是,在主线线程之外的线程中直接更新页面显示的问题是:系统会报这个异常: ERROR/AndroidRuntime(1222): android.view.ViewRoot$CalledFromWrongThreadException: Only the original

关于java线程运行的问题

问题描述 public class Test{public static void main(String args[])throws Exception{int i=0;Hello h=new Hello();Thread t=new Thread(h);t.setPriority(Thread.MAX_PRIORITY);t.start();System.out.println("Please stop saying Hello and say good morning!");h.

Android任意时刻从子线程切换到主线程的实现

引入 在Android开发中常常会遇到网络请求,数据库数据准备等一些耗时的操作:而这些操作是不允许在主线程中进行的.因为这样会堵塞主线程导致程序出现未响应情况. 所以只能另起一个子线程进行这些耗时的操作,完成后再显示到界面.众所周知,界面等控件操作只能在主线程中完成:所以不可避免的需要从子线程切换到主线程. 方法 对于这样的情况在Android 中比较常见的是使用AsynTask类或者 Handler来进行线程切换:而其中AsynTask是官方封装的类,较为简单,效率也比较可以,但是并不适合所有