请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

StringBuilder 与 StringBuffer 的问题

看了问答区,有个问题不大明白,原图是:
图片描述

不理解老师说的“如果执行完成,那么就会先输出结果“
图片描述

正在回答

3回答

翔仔 2019-10-08 00:03:54

同学好,join方法

你这里在For循环中,不仅仅每次调用atest.join都是主线程调用的,就连for循环,生成子线程去执行也是mian线程发动的。这里会出现串行,比如说生成第一个子线程执行的时候,由于main函数调用了join,那么它会等到第一个子线程执行完成才继续执行后续的for循环生成新的子线程2,依次类推,顺序执行并打印,就是你看到的结果。

另外一个,只能说你这样的执行对于cpu来说负担很小,执行效率很高,因此结果接近概率较大,多线程间的执行结果没法预期。

0 回复 有任何疑惑可以回复我~
  • 提问者 MySweeties #1
    懂了,谢谢老师!
    回复 有任何疑惑可以回复我~ 2019-10-08 10:46:35
提问者 MySweeties 2019-10-07 09:12:37

https://img1.sycdn.imooc.com//szimg/5d9a12c90976220106360468.jpg

https://img1.sycdn.imooc.com/szimg/5d9a15f3097f2f2600000000.jpg

如上图:

0 回复 有任何疑惑可以回复我~
翔仔 2019-10-07 02:03:11

同学好,这个真考验记忆力呀:)仔细看了下,当时要表达的意思是,现在有10个线程,共同操作同一个StringBuilder和StringBuffer对象,那10个线程执行完成有先后,并不是同时执行完成的,比如第一个线程先执行完成了,那么它就在run里面打印了结果,此时结果并不会等于10000呀,得等最后一个线程执行完成后,才打印10000.。。。

0 回复 有任何疑惑可以回复我~
  • 提问者 MySweeties #1
    我动手实践了一下,并打印了时间戳,发现情况正如老师所说。。
    现在我有一个问题,因为for循环是控制添加一千个c字符,那么如何使打印结果出现 线程0-9按次序同时buffer打印数量一千一千的往上增的现象呢?我实践过老师给的建议,使用join方法,结果的确达到上述预期,但同时我对join方法产生了疑问,join方法的作用是当某个程序执行流中调用了其他线程的join方法时,调用线程将被阻塞,直到join的线程执行完。。我执行多次的结果是线程按0-9依次显示,最后main方法结束,也就是说第i+1个线程被阻塞,在等待第i个线程执行完,但是这10个线程之间并没有调用join的关系,而是main同10个线程之间存在调用关系,为什么也会出现0-9依次打印的现象?是不是我对join方法的理解有误?(修改后的代码已上传至问答区)
    回复 有任何疑惑可以回复我~ 2019-10-07 09:09:45
  • 提问者 MySweeties #2
    另外,观察结果发现每个线程结束时打印的数量都很靠近,为什么没有出现某一个线程打印的数量极小比如3999的情况?我对Thread-0线程设置了最大优先级,发现Thread-0结束时数量同样到达了9900左右
    回复 有任何疑惑可以回复我~ 2019-10-07 09:23:07
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信