JAVA 多线程问题?

qq_32616457 学生  2017-11-06 09:38:34
@Test
public void do_button2_actionPerformed() {
final StringBuilder sb = new StringBuilder();
for ( int i=0 ; i < 5; i++) {
new Thread() {
public void run() {
sb.append("《Java编程词典》");
System.out.print(sb.toString());
System.out.println(" ");
};
}.start();
}
}
在对以上代码测试运行时,出现结果如下图,我不知道如何解释?

因为我在每条线程体结束有换行,所以图片显示也是5行,但是中间空内容一行我不理解,刚学多线程,希望懂的人可以在本帖下面给出解释?
这个是又是另一种情况的输出,理解不了。该通过什么样的学习或者过程中什么方式理解多线程:
...全文
407 4 点赞 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tanling8334 2017-11-06
你要明白一点,你能控制线程的创建先后,但是无法预测各个线程的执行先后,而且线程是交替执行的,不是一个执行完才执行另一个。所以你写的这个程序,每次运行可能结果都不会一样。如果你想控制各个线程的先后,需要用到线程同步和互斥。例如经典的生产消费者问题。这个不多说了 你写的程序中,主线程是for所在的那个线程,它很快会执行完毕,它创建完五个独立线程后就完结了。至于被创建的那五个那个被先执行完全取决与JVM。你控制不了。还有你要注意互斥,应为StringBuffer是线程安全的,所以输出还算正常,如果你使用的StringBuild这个线程不安全的类可能结果会更加意想不到。这就是所谓的互斥问题,你可以把StringBuffer换成StringBuilder试一试
  • 打赏
  • 举报
回复
tanling8334 2017-11-06
你要明白一点,你能控制线程的创建先后,但是无法预测各个线程的执行先后,而且线程是交替执行的,不是一个执行完才执行另一个。所以你写的这个程序,每次运行可能结果都不会一样。如果你想控制各个线程的先后,需要用到线程同步和互斥。例如经典的生产消费者问题。这个不多说了 你写的程序中,主线程是for所在的那个线程,它很快会执行完毕,它创建完五个独立线程后就完结了。至于被创建的那五个那个被先执行完全取决与JVM。你控制不了。还有你要注意互斥,应为StringBuffer是线程安全的,所以输出还算正常,如果你使用的StringBuild这个线程不安全的类可能结果会更加意想不到。这就是所谓的互斥问题,你可以把StringBuffer换成StringBuilder试一试
  • 打赏
  • 举报
回复
run是构造方法,它只是将创建一个对象准备给你用,并不是说你已经就在用了,你可以将它当成你的一个成员。 只能在你调用start()方法的时候它才能使用。 但是你5个线程依次启动之后,他们在运行的时候,运行速度怎样,运行到了那一块,那一个步骤,取决于CPU的运行机制。 假如cpu将某一个时间段 先后分成 5个时间片 ,它们中有4个先后运行到了这个地方: sb.append("《Java编程词典》"); System.out.print(sb.toString()); 然后再根据cpu 分配运行这里:System.out.println(" "); 就像同样内容的5本书,我依次给5个人看,但他们的看书速度我却没有办法决定,只能是他们的大脑自己决定。 也许在某一个时间段他们其中两个人就读到了同一段文字。 线程运行机制:实际上就是为了将CPU的性能(空闲时间)最大化利用,一个CPU它在一个时间片只能允许一个线程运行。 如果你学了同步的话你就更加了解了, 这里就相当于一个并发事件了。 如果你知道了高并发。。。。。。那么你恭喜你也就。。。。进入了一个死胡同。 个人对目前高并发的一点建议:可以开发一个针对当前高并发的硬件取缔目前繁琐的分布式服务器。
  • 打赏
  • 举报
回复
hycf 2017-11-06
线程start后只是说线程准备要开始运行了,哪个运行还要看CPU给谁分配执行时间。
  • 打赏
  • 举报
回复
相关推荐
发帖
Java SE
加入

6.2w+

社区成员

Java 2 Standard Edition
申请成为版主
帖子事件
创建了帖子
2017-11-06 09:38
社区公告
暂无公告