我对线程的一点新的认识

今天,通过一段代码,研究了一下java 线程, 发现了一下的一点规律:

    1.线程只是代码的一个执行路线,比如在一个含有静态main函数的java程序中,很显然,这个main函数就是整个程序的入口函数,沿着main入口函数而执行的代码最后必将还是从main函数退出,只不过可能在main函数中会调用其它的函数,甚至调用其它包的其它类的某个函数,不管它调用什么函数,总而言之,其执行的路线就是从main开始,然后,jvm根据类的定义代码,实例化一些类的实例对象,将其载入内存,再执行该对象的某个方法,然后,再在该方法中,同样的实例化其它的类的对象,再执行该对象的方法。 到这里,我们可以发现, 类文件的代码其实只是说明书,告诉jvm,需要实例化的类的规格而已。在执行的过程中,其实是先实例化某个类的对象,然后,通过一个句柄引用该对象,再通过该句柄调用该对象的方法,在该工程中, 一段某个对象被引用的句柄数位0的时候,则jvm就认为该对象已经没有被其它的对象使用了,于是就垃圾回收了。  最终,当所有的方法执行完了的时候,回到main方法,最后 退出程序。 这个过程是典型的单线程java程序的执行过程,打个比方,这个过程就好像是穿念珠,线就是整个线程的执行路径,而那一个个珠子,就好比是各个对象,线总会从各个珠子中穿过,就好比线程,总是要穿过对象的各个方法。

    而多线程java程序的执行就与上面的有些不同了。多线程的程序,在执行的过程中,除了main主线程以外,会产生新的线程,称为子线程。而所有的这些线程之间都是并行执行的(至少在逻辑上是并行执行),也就是说,主线程一旦产生子线程,并且start以后,会接着按照自己的路线执行下去,而同时子线程也按照自己的路线执行,这时就有多个串珠了,每个都是一个线程的执行路径。 在多线程java程序的运行过程中,这些线程往往都是相互合作的,好比进程是一个屋子,而各个线程都是这个屋子里面的各个工人一样,虽然都在按照自己的路线干自己的活,但是,相互之间是协作关系。 我曾经作过实验,在一个画图程序中,主线程负责画图,有主线程产生的子线程负责变换坐标,这样,每次画图都在不同的位置,于是就形成了动画效果。 在这样的一个程序中,当在主线程中启动子线程以后,我就让主线程suspend下来了,然后,观察子线程,发现子线程还是在不停的变换坐标,也就是说,子线程不管子线程,还是一个劲的忙自己的事情。 这样,虽然坐标不断的在变换,但是,主线程暂停,自然,图也就没有画出来了。 这说明, 主线程产生子线程以后, 就不管子线程了,这样就各自为政了。 所以, 在多线程编程中, 就产生了线程间交互的需求,只有通过各个线程间的交互协调,才能更好的控制各个线程间的相互协作,更好的完成一件事情。

 

补充说明一点: 测试发现, 当主线程产生的子线程还在运行的时候, 主线程执行到main的最后一行以后,不是直接退出,而是suspened了, 也就是说,主线程在等待子线程完成,当子线程完成以后,主线程就自动exit了。 可见 ,主线程还是很仁慈的了。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

walkingmanc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值