当前位置: 代码迷 >> J2SE >> 新人提问:java多线程有关问题
  详细解决方案

新人提问:java多线程有关问题

热度:54   发布时间:2016-04-23 19:39:59.0
新人提问:java多线程问题
为了测试多个线程运行的情况,我自己想出来下面的代码
public class TThread{
public static void main(String[] args){
A aa = new A();
Thread t1 = new Thread(aa);
t1.start();

Thread t2 = new Thread(new B(t1));
t2.start();


System.out.println(t1.getName());

}
}

class A implements Runnable{
@Override
public void run(){
for(int i=0; i<10; ++i){ 
System.out.println(Thread.currentThread().getName());
}
}
}

class B implements Runnable{

Thread t;
public B(Thread t){
this.t = t;
}
@Override
public void run(){
t.setName("哈哈");
}
}

某次运行结果是如下:
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
哈哈
哈哈
哈哈
哈哈
哈哈
Thread-0

我自己思考结果的时候认为既然哈哈出现,那t1进程的名字就应该已经被修改了,以后的get到的t1的名字不就都应该是哈哈了么,为什么还会出现初始默认的Thread-0的结果。不知道是我哪里推理错了,还是对某个方法的执行过程没有了解透彻
------解决思路----------------------
引用:
Quote: 引用:

楼主多分析下线程的异步执行过程就明白了。你的代码主要有3个线程,t1、t2、和main线程。你可以假设main线程优先执行(另外2个线程还在加载中还没调run方法)。当main线程执行完println(t1.getName())时,此时t1.getName()的值为Thread-0(因为t2的setName操作还没执行),即调用println(String name),此时传入了"Thread-0"。直到这个操作结束。现在假设main线程暂停执行(开始等待cpu调度),后续t1和t2正常执行完。输出楼主能看明白的结果。
最后回到main线程开始执行:输出Thread-0

也就是说println分两步执行,第一步被调用(String name被赋t1的名字),第二步,将结果显示到dos窗口中。而不是System.out.println()这个语句一步到位的执行?这是不是应该是print流那会有详细解释?

是的,System.out对应的是PrintStream这个输出流,PrintStream底层又会调用到BufferedWriter和OutputStreamWriter这2个输出流。具体你可以看下System这个类中的out静态变量,及PrintStream这个类中的println()方法及其各个重载方法的实现操作。所以一个输出语句的打印会涉及到各个类之间的调用。不是立刻输出。所以才会有你疑问中的相关描述。