java多线程的问题为何输出结果只有一个?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程的问题为何输出结果只有一个?相关的知识,希望对你有一定的参考价值。

public class ThreadDD
public static void main(String []args)
Thread tt=new TestThread();
tt.start();
int index=0;
while(true)
if(index++==100)

trytt.join();catch(Exception e)

System.out.println("main"+Thread.currentThread().getName());





class TestThread extends Thread
public void run()
while (true)
System.out.println("run" + Thread.currentThread().getName());


1、主要是tt.join的问题。
2、当子线程开启后,主线程和子线程是并发或并行执行的,会多线程输出。
但是tt.join是指将tt线程与主线程(即tt.join这段代码所运行时候的线程)合并,即等tt.join运行完后执行刚刚的主线程。
而你的tt线程中的run()方法为:while(true)所以tt.join之后,tt一直在运行,
故只能看一个线程在运行。

希望能解决你的问题。
参考技术A tt.join();//这里的意思是等tt执行完,才往下执行,而tt是死循环,所以永远不会往下执行

java多线程问题 我很好奇这两个结果是怎么运行出来的,我知道产生这种结果差异的原因在红线出。

首先,因为这里的两个线程里面传的都是同一个c对象,而c里面调用add的,只有一个bank对象,所以sum对两个线程是共享的。
当一个线程运行完红线内的第一个语句,没来得及打印,被另一个线程抢先,另一个线程传入num值100的时候,sum已经是100了,那么第二个线程打印200,我能理解。但是虽然sum值是共享的,但是第一个线程在被赶超的时候肯定是已经执行完红线内第一个语句的,那么接着第一个执行红线的线程肯定应该是打印100呀,怎么还会再打印一次200呢?

线程安全的问题,就是当你的第一个线程在给sum传值时还没有进行累加,而第二个线程用时在累加中,第一个线程还没累加赋值给变量,第二个线程所以累加的值没第一个线程累加的值追答

线程是同时进行的,不是像你控制台打印时的顺序那样运行的,首先知道线程运行原理,再知道线层安全问题

追问

那按你说的,第一个线程值传进来还没累加,那么第二个线程第一次开始累加前sum仍然是初始值0,第二线程执行完第一次应该打印100才对,怎么会打印200呢

追答

这个你不用纠结,就是线程安全问题,所以会出现不合常理的数据,在java中叫脏数据,你只需改一行代码就能解决

在add方法的void前加上synchronized

参考技术A 你也说了,没来得及打印
再轮到它打印的时候,sum已经是200了,怎么还会打100?追问

但是先进来的线程已经执行完sum=sum+num了,只是等着打印,难道第二个线程执行完这个语句打印后,第一个语句还会回去读一遍sum等于多少吗
那又假如按你所说,第二个线程进来将将sum值变成了200,第一个线程反正只负责吧 sum值打出来,这样肯定就是再打一次200。但是我多执行几遍这个代码,又出现了上图第二种结果,第一个打出200,第二个打出100,又怎么会打出100来呢

追答

是到打印的语句执行那一刻,才去读取sum值的,你的理解有误。
读取的那一瞬间,是100就读到100,是200就读200,语句是顺序执行,不会回头执行的。

以上是关于java多线程的问题为何输出结果只有一个?的主要内容,如果未能解决你的问题,请参考以下文章

java多线程编程代码如下,输出结果如下:

Java 多线程实现的三种方法,附两个线程执行不同的输出

java多线程问题 我很好奇这两个结果是怎么运行出来的,我知道产生这种结果差异的原因在红线出。

java中多线程执行时,为何调用的是start()方法而不是run()方法

全面了解 Java 原子变量类

java 多线程–线程交替